質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

12060閲覧

「パラメーターカウントが一致しません」というバグの解決方法と原因について

yar

総合スコア16

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2020/09/25 07:30

タイトルの通りなのですが現在「パラメーターカウントが一致しません」というバグが発生しまい困っています。
該当のソースが以下です

C#

1// 非同期処理用 2Thread thread = new Thread(new ThreadStart(() => 3{ 4 Invoke(new System.Action(別クラスの関数),(object) textBox1 ); 5  Thread.Sleep(100); 6})); 7thread.Start();

もともと別クラスの関数で「textBox1 」を使用した際に、

「有効ではないスレッド間の操作: コントロールが作成されたスレッド以外のスレッドからコントロール 'textBox1' がアクセスされました。」
というバグが発生したのでinvokeを使用しましたが、実行するとタイトルのバグが発生してしまいます。

「別クラスの関数」では配列の情報をtextBox1に入力させる処理をしています。

このバグはどうすれば解決するでしょうか?またなぜこのバグが発生するのか合わせて教えていただきたいです。

VS2019でC#FormApplicationを使用して開発しています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ry188472

2020/09/25 07:40

Invoke を textBox1.Invoke に変更したら動作しませんか?
yar

2020/09/25 07:46

>ry188472 様 回答ありがとうございます。 動作しました!ありがとうございます。 「パラメーターカウントが一致しません」のバグ発生理由も教えていただけないでしょうか?
guest

回答1

0

ベストアンサー

// 非同期処理用 Thread thread = new Thread(new ThreadStart(() => { textBox1.Invoke(new System.Action(別クラスの関数),(object) textBox1 );   Thread.Sleep(100); })); thread.Start();

これで動作する理由としては、textBox1.Invoke(処理)はtextBox1が存在するウィンドウのスレッド=GUIスレッド上で処理を同期実行するためです。
Control.Invoke メソッドも確認してください。

単純にInvoke(処理)とかくとthis.Invoke(処理)になります。thisがtextBox1のGUIスレッドと異なっていることを確認してみてください。(そもそも、thisがなんのインスタンスなのか、FormなのかControlなのか処理クラスなのかがわかりませんが)

投稿2020/09/25 07:56

ry188472

総合スコア74

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ry188472

2020/09/25 07:58

書き忘れたので補足ですが、コントロールを別スレッドからさわれない理由としては、マルチスレッドで画面部品を安全に処理しようとすると排他制御が必要になりコストが高くなるため、単一スレッド以外からのアクセスを封じています。 ちなみに、あまりThreadStartで別スレッドを起動することはおすすめできません。async-await等に置き換えできないか検討してみることもおすすめします。
yar

2020/09/25 08:02

改めて回答、解説ありがとうございます。 スレッドが違うことで起こる不具合だった...って解釈したのですがあ合ってますかね? これで想定していた動作はできたのでベストアンサーに選ばさせていただきます。ありがとうございました。
yar

2020/09/25 08:03

なるほど...async-await等の他の動作についても調べてみます。ありがとうございました。
Zuishin

2020/09/25 08:10

不可解な回答とベストアンサーなので低評価しておきます。動作するコードと解説をお願いします。
ozwk

2020/09/25 08:13 編集

public object Invoke (Delegate method, params object[] args); では? > オーバーロード
Zuishin

2020/09/25 08:15

params がついていましたね。低評価を解除し、高評価します。
ry188472

2020/09/25 08:17

なんかとんちんかんなこと書いてしまったかと思って焦りました。 ふと思ったんですけどnew System.Action(別クラスの関数)の部分って、別クラスの関数で別スレッドを起動していたら、Control.InvokeしてもGUIスレッドでの処理になるとは限らないんですかね??
Zuishin

2020/09/25 08:21

早とちりすみませんでした。 私もそこが疑問です。UI スレッドをわざわざ複数立てているのでなければ、Invoke でもいいはずで、エラーメッセージもパラメーターカウントがどうこうにはならないはずなんですよね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問