2011-12-22 9 views
0

システムに問題があることをユーザーに示すためにどこからでも呼び出せる、例外処理プロジェクトがアプリケーション内にあります。期待どおりUIのどこかから呼び出しが行われると、すべてがうまく動作します。アプリケーションのUI部分からの呼び出しを行うと、すべてがフリーズします。私はスレッドセーフな呼び出しに包まれたコードを持っており、ステップ実行するときにInvoke呼び出しを必要としません。どんな助けでも大歓迎です。以下のコード:Windowsフォームへのスレッドセーフな呼び出しによってアプリケーションがフリーズしています

クラスはアプリケーション

ECDUExceptions.Error newError = ECDUExceptions.Error.getInstance(); 
newError.FaultError("Heater is not responding to function calls, it has been turned off"); 

答えて

2

いくつかの情報を再起動する方法:このようかわりInvoke(...)

  1. 使用BeginInvoke(...)は、通話が終了するのを待機しません、ので、呼び出し元のスレッドを凍結しません。

  2. 再呼び出し時にActionを使用してください。このようなキューがすでに存在する

    BeginInvoke(new Action<string>(err_DispEvent), text); 
    
+0

署名が一致する場合は、 'BeginInvoke(err_DispEvent、text);ではありませんか? – Adam

+0

@codeparkle私はそう信じています。 –

+0

私はあなたの質問に編集を提案してもいいですか(両方の選択肢を示していますか?) – Adam

1

使用するBeginInvoke(に使用されているかのクラス

public void FaultError(string errorMsg) 
    { 
     FaultForm fform = new FaultForm(errorMsg, "Internal Fault"); 
     if (this.dispEvent != null) 
     { 
      dispEvent(errorMsg); 
     } 
    } 

    public event DisplayDelegate DispEvent 
    { 
     add { dispEvent += value; } 
     remove { dispEvent -= value; } 
    } 

    private event DisplayDelegate dispEvent; 

    public delegate void DisplayDelegate(string text); 

サンプルからフォーム

void err_DispEvent(string text) 
    { 
     if (InvokeRequired) 
     { 
      Invoke(new Error.DisplayDelegate(err_DispEvent), new object [] {text}); 
     } 
     else 
     { 
      this.Show(); 
     }   
    } 

コールインサイド.. 。)の代わりにInvoke(...)を使用します。これは、キューの最後にメッセージ要求を入れます。

0

表示するメッセージの並べ替えを作成します。

必要なスレッドをすべてキューに入れてください。

メッセージの表示を担当するGUIから、タイマーを使用してデキューして表示します。

簡単ですが、楽に作業します。また、Forms.TimerはUIメッセージループ上で動作するので、Invoke()を行う必要はありません。

+0

:メッセージループをだからあなたの場合には、あなたはあなたの呼び出しを変更することができます。 BeginInvoke()を使用して、キューの最後にアクションを追加します。 – Daniel

関連する問題