質問: Convert.ToString(i.ToString()); } private void button1_MouseDown(object sender, MouseEventArgs e) { i1++; Invoke(new TestDelegate(change), i1); } ``` ### 補足情報(言語/FW/ツール等のバージョンなど) Visual Studio 2015で開発しています。
回答: ご提示のソースからFormアプリを作って一所懸命連打してみましたが、おっしゃる問題は再現できませんでした。 なので一般的なデバッグ手法としてのアドバイスになりますが、まずは **問題が発生する最小条件** のプログラムを作りましょう。 * ボタン4つ、ラベル4つと書かれていますが、1つずつだと発生しないのでしょうか?2つずつではどうですか? * 以下のように書かれているケースでは、結局問題は発生したのでしょうか?しなかったのでしょうか? (問題発生したならば、Formが2つあること、Convert.ToString()していることは条件から外していいということになります) > > 自分なりに調べた結果、スレッドセーフな呼び出しとFormを1つだけ表示させるようにしました。 > > > はじめは以下の通り、直接書き換えようとしました。 > > > * Form2のラベルを書き換えている部分(bw_RunWorkerCompleted内)は、ラベルを書き換えようとしなければ例外発生しないのでしょうか? * 変数iの値を増減している部分は、iの値を変更しようとしないと問題が発生しないのでしょうか? 以上のように、1つずつ、問題発生と無関係な要素を削っていき、一番簡潔に問題を再現できる状態を見つけましょう。 ご質問いただく場合も、その状態のソースをご提示されるとだいぶ回答をもらいやすくなると思います。 あとは、ソースを見た感じで怪しそうな部分を当てずっぽうでお伝えしておきます。参考程度にどうぞ。 * bw_DoWork内で、ご提示のコードではプロパティに値を入れることしかしていませんが、本当にそうなのですか? (だとしたらわざわざBackgroundWorkerを使わないんじゃないかと思いますが...) ここで何か処理をしているのであれば、まずはこのbw_DoWork内の処理で例外がスローされていないかどうか、try-catchして確認してみてください。 * 以下の書き方は、連打された場合、if文の判定でIsBusyがFalseであることを確認しても、そのあとRunWorkerAsyncを呼ぶ時点ではIsBusyがTrueになっていることもあり得るので、危険な書き方です ``` if (wk.bw.IsBusy != true) { ... wk.bw.RunWorkerAsync(i1); } ```