例えば、以下のメソッドのようにコントロールやフォームに関する処理は、複数のスレッドで実行しても正しく動作しません。
private void DisplayMessage(string value) {
if (form1 == null) return;
if (label1 == null) return;
label1.Text = value;
}
正しく動作させるには、Invoke と InvokeRequired を使うと便利です。
上記のメソッドは、以下のように書きなおすことで、別のスレッドで実行しても正常に動作します。
private void DisplayMessage(string value) {
// 上記のメソッドを匿名メソッドとして a に格納
Action<string> a = s => {
if (form1 == null) return;
if (label1 == null) return;
label1.Text = value;
};
if (InvokeRequired) { // メインスレッドでなければ、
Invoke(a, value); // メインスレッドで実行
}
else {
a(value); // そうでなければ、このスレッドで実行
}
}
何をしているのかというと・・・コメントの通りですw