web-dev-qa-db-ja.com

他のスレッドからメインスレッドのメソッドを呼び出す

たとえば、C#アプリケーションで3つのレベルのタイマーを同時に実行しようとしています。

T1はアプリケーションの最初に実行され、そのTickイベントでT2が開始され、T2のTickイベントでT3が開始されます。最後に、T3のtickイベントで、アプリケーションのメインスレッドで何かを行う必要があります

私の問題は、メインスレッドのコードが他のスレッドによって呼び出されているときに機能していないことです

メインスレッドが他のスレッドからの呼び出しによってその機能を実行できるようにするにはどうすればよいですか?

12
user2302005

おそらく問題は、メインスレッドが呼び出しを必要とすることです。デバッガーでプログラムを実行すると、クロススレッド操作の例外が表示されますが、実行時には、この例外チェックは無効になっています。

メインスレッドがフォームの場合、次の短いコードで処理できます。

 if (InvokeRequired)
 {
    this.Invoke(new Action(() => MyFunction()));
    return;
 }

または.NET 2.0

this.Invoke((MethodInvoker) delegate {MyFunction();});

編集:コンソールアプリケーションの場合は、以下を試すことができます:

  var mydelegate = new Action<object>(delegate(object param)
  {
    Console.WriteLine(param.ToString());
  });
  mydelegate.Invoke("test");
22
VladL