2009-05-25 15 views
6

私は、Windowsフォームアプリケーションのスレッドに関する何かを学ぶためにTestboxを構築しました。 SilverlightとJavaがDispatcherを提供しています。これは、 GUI要素の更新時に本当に役立ちます。C#でのデリゲートの構文の問題

コードサンプル: 宣言クラスの委任

public delegate void d_SingleString(string newText); 

作成スレッド

 _thread_active = true; 
     Thread myThread = new Thread(delegate() { BackGroundThread(); }); 
     myThread.Start(); 

スレッド関数

private void BackGroundThread() 
    { 
     while (_thread_active) 
     { 
      MyCounter++; 
      UpdateTestBox(MyCounter.ToString()); 
      Thread.Sleep(1000); 
     } 
    } 

委任のTextBoxアップデート

public void UpdateTestBox(string newText) 
    { 
     if (InvokeRequired) 
     { 
      BeginInvoke(new d_SingleString(UpdateTestBox), new object[] { newText }); 
      return; 
     } 
     tb_output.Text = newText; 
    } 

BeginInvokeメソッドでDelate Declarationを宣言する方法はありますか?あなたは、フレームワークからAction<T>デリゲート(link to msdn)を使用することができ、このような単純な代表団のために

BeginInvoke(*DELEGATE DECLARATION HERE*, new object[] { newText }); 

多くのおかげで、 rAyt

答えて

9

このような多くの場合、最も簡単な方法は、スレッド間で状態を渡すために「キャプチャされた変数」を使用することです。これは、あなたがローカライズされたロジックを保つことができることを意味:

public void UpdateTestBox(string newText) 
{ 
    BeginInvoke((MethodInvoker) delegate { 
     tb_output.Text = newText; 
    });   
} 

を上記の我々はそれがワーカースレッド(InvokeRequiredをチェックするので、少しポイント)に呼び出されるを期待場合に特に便利です - これはどちらかから安全であることに注意してくださいUIまたはワーカースレッドを使用して、スレッド間で状態を多かれ少なかに渡すことができます。

+0

あなたのeloborationマークを愛してください。ちょうど10分MSDNを読むより多くを学んだ:) –

+0

シングルスレッドのアパートの驚異... – Spence

+0

非常にエレガントなソリューション、それは本当にこの質問のための受け入れられた答えであるべきです。 –

4

よう

何か。

public void UpdateTestBox(string newText) 
{ 
    if (InvokeRequired) 
    { 
     BeginInvoke(new Action<string>(UpdateTestBox), new object[] { newText }); 
     return; 
    } 
    tb_output.Text = newText; 
} 

あなたは独自のデリゲート宣言を維持する必要はありません。

+2

戻り値が必要な場合はFunc ... – tanascius

+0

素晴らしい!ありがとう、フレドリク。 –

+0

tanascius、あなたのコメントを記載できますか?ありがとう! –