2009-04-24 5 views
1

私は非同期ソケット入力のステータスを報告するために使用されているので、スレッドセーフである必要があるToastを作成しています。私はそれをスレッドセーフにしようとしましたが、トーストはまだロックされています。スレッドセーフなForm.Show

public static void Show(string message) { 
     Toast toast = new Toast(message); 
     toast.ShowAction(); 
    } 

    private delegate void InvokeCallback(); 

    public void ShowAction() { 
     if (InvokeRequired) { 
      Invoke(new InvokeCallback(ShowAction)); 
     } 
     else { 
      Show(); 
     } 
    } 

私は、メッセージボックスのように簡単に、すなわちToast.Show("Status changed");をそれらを表示できるようにしたいです。どんな助けでも大歓迎です。

答えて

1

あなたの問題はToastが別のスレッドで作成されているという事実です。おそらくあなたがする必要があるのは、Invoke()を作成してToastを表示し、すべてのUIを同じスレッドに保つことができるメインのUIスレッドに「ターゲット」を置くことです。

EDIT

あなたが別のスレッドでこれを維持することができるようにする必要がある場合は、あなたの唯一のオプションは、メッセージループを持つ別のスレッドを作成することです。

Thread t = new Thread(); 

t.SetApartmentState(ApartmentState.STA) // Required for a UI thread 

このスレッドにタスクとメッセージをディスパッチする実装に関しては、私はあなたに任せます。メッセージループを開始するには、最初にApplication.Run()に電話する必要があります。

そして、いつものように、メインUIスレッドとやりとりするToast(またはこのスレッドのすべて)からの操作は、必ずInvoke()にする必要があります。

+0

フォームを作成するのと同じスレッドで、フォームの周りにメッセージループを実行できます。単に行う:Application.Run(フォーム);フォームは現在制御されているので、必要に応じてフォームを閉じる必要があります。 –

+0

@ lassevk:NO NO NO!起動していないスレッドでは、メッセージループを開始しないでください。これは悲惨な結果をもたらす可能性があります! –

関連する問題