2016-04-12 8 views
0

私はC#と確かにOOPの概念を新しくしています..私の質問の愚かさを許してください。イベントハンドラを使って作業する - ただし必ずしもそうではありません。(どうすればいいですか...)

私は通信したいシステムを持っています。関連する応答で呼び出すことができるいくつかのコマンドがあります。 (通信はTCP/IPまたはシリアル経由で行われます)(複数のトランスポートメカニズムを使用できるように、SendMessageとのインターフェイスを実装しました)

それぞれのコマンドにメソッドを作成して公開します。デバイスはまた、私が動作したいと思う 'ブロードキャスト'メッセージを言うことができるので、これはうまく動作するイベントハンドラを使用していた..

現時点では、イベントハンドラで私はOKとERRORスタイルメッセージしかし理想的には、上記のメソッドからコマンドを送信してエラーをキャッチし、コマンドに基づいてブール値を返すこともできます。

誰かがこのようなことをして正しい方向に向ける方法を考えることができますか?

おかげ

デビッド

+0

が広すぎる:イベント上がるよう

readonly object _waitLock = new object(); public void Wait() { lock (_waitLock) if (!Monitor.Wait(_waitLock, 3000)) throw new TimeoutException("No communications"); } 

信号を同時に:


そうでなければ私は単にブロッカーとして使用する通信クラス内のメソッドを持っているでしょうあなたは現在何をしていますか?代わりに何をしたいですか?メソッドの内部では、イベントをサブスクライブすることができ、タイムアウトやイベントハンドラが呼び出されるまで実行をブロックし、それが質問であれば続行できます。 – Sinatr

+0

私は、現在のイベントハンドラを何かからブロックすることができると思っています。そのコマンドの応答を取得するためのメソッド内のレスポンスをキャッチしてから再び有効にしますが、正しくはありません –

+0

次にイベントハンドラを使用しないでください。別のシグナル伝達機構(例えば、 'Monitor.Pulse' /' Monitor.Wait')を提供してください。過去に私はイベントに登録していた通信クラスのヘルパーを書いて、特定の返事を待ってから帰ってきました。しかし、その後、私は「モニター」の存在を発見しました([Albahari](http://www.albahari.com/threading/part4.aspx#_Signaling_with_Wait_and_Pulse)のおかげで)、それ以来それを使用しています。 – Sinatr

答えて

0

あなたがイベントを待つためにヘルパーを使用することができます。過去のいくつかの醜いコード:

public class ComWait 
{  
    ManualResetEvent _waitEvent; 
    SomeEvent _eventHandler; 

    public ComWait() 
    { 
     _waitEvent = new ManualResetEvent(false); 
     _eventHandler = new SomeEvent(Watch); 
    } 

    void Watch() 
    { 
     _waitEvent.Set(); 
    } 

    public bool Wait(int time = 3000) 
    { 
     _waitEvent.Reset(); 
     SomeEvent += _eventHandler; 
     bool result = _waitEvent.WaitOne(time, false); 
     SomeEvent -= _eventHandler; 
     return result; 
    } 
} 

使用は、イベントが発祥またはタイムアウトが発生するまで、それは単に同期方法をブロックする

ComWait wait = new ComWait(); 
if(!wait.Wait()) 
    return; // timeout 
// process 

あります。パラメータを追加するのは簡単です:特定のイベントのブロックを解除し、イベントハンドラのパラメータを呼び出し元に戻す必要があります。あなたが見ることができます、

lock (_waitLock) 
    Monitor.PulseAll(_waitLock); 
関連する問題