2017-06-20 10 views
0

Visual StudioでC#を使用してOutlookアドインで作業していますが、作業ウィンドウで変数を継続的に更新しようとしています。私は、ユーザーが作業ウィンドウを開いて、リアルタイムで可変増分を見ることができるようにしたいと思います。私は与えられた時間枠が終了するまで作業ウィンドウを更新しようとしています作業ウィンドウを継続的に更新します。

togglebutton1_click(object sender, EventhandlerArgs e){ 
    value += 1; 

    taskPane.label.text = "" + value; 
} 

:ここで私が働いているかの基本的な例です。タイマーハンドラーのラベルを更新しようとしましたが、別のスレッドで作成されたため、更新できませんでした。どんな助けもありがとう。ありがとう!

答えて

0

Windowsフォームのコントロールは特定のスレッドにバインドされており、スレッドセーフではありません。したがって、別のスレッドからコントロールのメソッドを呼び出す場合は、コントロールの呼び出しメソッドのいずれかを使用して、呼び出しを適切なスレッドにマーシャリングする必要があります。

基本的には、InvokeメソッドとInvokeRequiredコントロールクラスのプロパティを使用する必要があります。このプロパティを使用すると、invokeメソッドを呼び出す必要があるかどうかを判断できます。これは、どのスレッドがコントロールを所有しているかわからない場合に便利です。

private void Button_Click(object sender, EventArgs e) 
    { 
    myThread = new Thread(new ThreadStart(ThreadFunction)); 
    myThread.Start(); 
    } 
    private void ThreadFunction() 
    { 
    MyThreadClass myThreadClassObject = new MyThreadClass(this); 
    myThreadClassObject.Run(); 
    } 


    // The following code assumes a 'ListBox' and a 'Button' control are added to a form, 
    // containing a delegate which encapsulates a method that adds items to the listbox. 

public class MyThreadClass 
{ 
    MyFormControl myFormControl1; 
    public MyThreadClass(MyFormControl myForm) 
    { 
     myFormControl1 = myForm; 
    } 

    public void Run() 
    { 
     // Execute the specified delegate on the thread that owns 
     // 'myFormControl1' control's underlying window handle. 
     myFormControl1.Invoke(myFormControl1.myDelegate); 
    } 
} 

アンより良い解決策はSynchronizationContextによって返さのSynchronizationContextなく、クロススレッドマーシャリングのための制御を使用することです。

関連する問題