2017-08-24 3 views
0

私はアプリを持っていますが、いくつかの方法があります。基本的にボタンクリックイベントとタイマーイベントです。ボタンをクリックするか、数秒経過すると、タイマーやボタンがメッセージを送信し(私はTCPメッセージだと思う)、すぐに別のアプリからの応答を待つ。メッセージと回答にはStreamWriter.Write()StreamReader.Read()を使用します。 (彼らはTCP文字列メッセージを作成して受け取ります。)C#で予期しないメッセージをキャッチする方法、メッセージを送信しているときにメッセージの回答を受け入れる場合もありますか?

しかし、予期せぬメッセージもあり、いつでも私のアプリに届くはずです。私はそれらを受け取る方法を知らない。

アイデア1:StreamReader.Read()ごとに、予期しないメッセージが表示されることがあります。しかし、それは悪い考えです。送信と読み取りのメッセージは非常に頻繁に発生しますが、すべての場所でコードを変更するのはちょっと変わった解決策です。

アイデア2:スレッドを使用します。それはStreamReader.Read()ですべての着信メッセージを受け入れます。しかし、私の主なスレッドでは、私はStreamReader.Read()メソッドを削除し、単に他のスレッドからの答えを待つ必要があります。これは(私は答えが得られない){}の間に起こりますが、これはまた悪い解決策であるようです。

アイデア3:イベントハンドラを使用していますか?私はこれを使ったことが一度もなかったので、このタスクにイベントを使用する方法について少し混乱しています。

他のアイデアはありますか?

+0

メッセージはどこから届いていますか?同じアプリですか?他のアプリですか?メッセージ・フレームワークの使用についてThougth? –

+0

その他のアプリそしてメッセージはTCPメッセージです、と私は思います。 (文字列) – greyline

+0

TCPはメッセージを送信しません。それは両方向のバイトの無限のストリームを行います。メッセージが必要な場合は、TCP上でそれらを実装するか、メッセージを行う上位プロトコルを使用するのはあなた次第です。現時点では、存在しないもの(TCPメッセージ)について話しているので、あなたが探しているものは非常に不明です。 –

答えて

0

あなたのアプリは遅れて回答を読むことができますか?私がうまくいけば、あなたのアプリはボタンで何かにメッセージを送ることができ、そのリクエストから時々自発的にメッセージを受け取ることができます。

私の頭に浮かぶのは、ポーリングスレッドです。

は条件が(通信をシャットダウンするように)満たされるまでループスレッドを作成し、イベントを上げている、と

while(active){ 
    if(yourStreamReader.Peek()>0) { //Blocking until data received 
    MyNewDataEvent?.Invoke(this, EventArgs.Empty); //Event raising 
    Acknowledge.WaitOne(); //Wait an acknowledge 
    } 
} 

を認め、この上げイベントにコールバックを使用するのを待ちます。

クールな効果は、ボタン送信リクエストからの回答にも役立つため、すぐに回答を読む必要はありません。それは、イベントとイベントハンドラについて学ぶ良い練習になります。それは、私には本当に便利です!警告:1つのスレッド/コールバックだけが同時にストリームリーダーを使用するように注意してください。

+0

MyNewDataEvent?.Invoke(this、e); //イベントの引き上げ "e"は何ですか?どのようにスレッドはそれを取得しますか? – greyline

+0

eは、デフォルトのEventHandlerのシグネチャの一部であるevents引数です。ここでプログラムはそれを使用しませんが、唯一の重要な点は、MyNewDataEventが呼び出されるとOnNewDataメソッドが呼び出されることです。EventArgs.Emptyを使用してイベント引数を必要としないという事実を反映するためにプログラムを編集しました。混乱させて申し訳ありません。 – Kinxil

+0

大丈夫、私はMyNewDataEventを書きましたか?.Invoke(this、null); ドットに問題があります。これをどうしたらいいですか? – greyline

関連する問題