2017-08-24 22 views
0

我有一個應用程序,有什麼幾個方法。他們基本上是按鈕點擊事件和計時器事件。當我點擊一個按鈕或幾秒鐘後,計時器或按鈕發送一條消息(我認爲TCP消息),並立即等待來自另一個應用程序的答案。我使用StreamWriter.Write()StreamReader.Read()作爲消息和答案。 (他們創建並接受TCP字符串消息,我認爲)。如何在c#中捕獲意外消息,同時發送消息,並且我也想接受消息的答案?

但也有意想不到的消息,什麼可以隨時到達我的應用程序。我不知道如何接收它們。

想法1:在每StreamReader.Read()之後,爲發生意外消息的情況做好準備。但這似乎是一個糟糕的主意。雖然發送和閱讀消息經常發生,但修改每個地方的代碼似乎有點奇怪的解決方案。

想法2:使用線程。它會接受每個傳入消息StreamReader.Read()。但在我的主線程中,我需要刪除StreamReader.Read()方法並簡單地等待來自其他線程的答案。這會發生在while(我沒有得到答案){},這似乎也是一個不好的解決方案。

想法3:使用事件處理程序?我從來沒有用過這個,所以我對如何使用這個任務的事件感到困惑。

還有其他想法嗎?

+0

消息來自哪裏?同一個應用其他應用?關於使用消息框架的使用? –

+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 
    } 
} 

並在此引發的事件使用回調。

event EventHandler MyNewDataEvent; 
ManualResetEvent Acknowledge; 
//... 
//... 
MyNewDataEvent += OnNewData; 
Acknowledge = new ManualResetEvent(); 
//... 
//... 
void OnNewData(object sender, EventArgs e){ 
    //Read the messages, do stuff 
    Acknowledge.Set(); //When done with StreamReader 
} 

很酷的效果是,它也適用於按鈕發送的請求的答案,所以你甚至不必立即閱讀答案。這對於瞭解事件和事件處理程序是一個很好的練習,對我來說,這非常有用!警告:小心只有一個線程/回調函數一次使​​用流讀取器。

+0

MyNewDataEvent?.Invoke(this,e); // Event raising 什麼是「e」?線程將如何得到它? – greyline

+0

e是事件參數,它是默認EventHandler簽名的一部分。這裏的程序沒有使用它,唯一重要的一點是在MyNewDataEvent被引發時,方法OnNewData將被調用。我通過使用EventArgs.Empty來編輯程序以反映您不需要任何事件參數,事實上,我應該首先完成這一事實。對困惑感到抱歉。 – Kinxil

+0

好吧,我寫了MyNewDataEvent?.Invoke(this,null); 它有點問題。該怎麼做? – greyline