如何在c#中捕获意外消息,同时我发送消息,我也想接受消息的答案?

时间:2017-08-24 13:09:07

标签: c# streamreader

我有一个应用程序,有几个方法。它们基本上是按钮点击事件和计时器事件。当我点击一个按钮或几秒钟后,计时器或按钮发送一条消息(我想是TCP消息)并立即等待另一个应用程序的回答。我使用StreamWriter.Write()StreamReader.Read()作为消息和答案。 (我认为他们创建并接受TCP字符串消息)。

但也有意想不到的消息,什么可以随时到达我的应用程序。我不知道怎么收到它们。

创意1:在每StreamReader.Read()之后,为可能发生意外消息的情况做好准备。但这似乎是个坏主意。尽管发送和读取消息经常发生,但在每个地方修改代码似乎都是一个奇怪的解决方案。

理念2:使用线程。它将接受StreamReader.Read()的每个传入消息。但在我的主线程中,我需要删除StreamReader.Read()方法,只需等待其他线程的答案。这会发生在while(我没有得到答案){},这似乎也是一个糟糕的解决方案。

创意3:使用事件处理程序?我从来没有使用过这个,所以我对如何使用事件来完成这项任务感到困惑。

还有其他想法吗?

1 个答案:

答案 0 :(得分:0)

延迟后,您的应用是否可以阅读答案?如果我做得好,你的应用程序可以通过按钮向某些内容发送消息,并且可以从中接收消息,有时也可以从该请求中接收,有时是自发的。

直接的事情,也许不是最好的,我想到的是一个民意调查线程。

创建一个循环,直到满足条件(如关闭通信),然后引发事件,并等待确认

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

在这个引发的事件上使用Callback。

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
}

很酷的效果是它也可以处理来自按钮发送请求的答案,因此您甚至不必立即阅读答案。这对于了解事件和事件处理程序来说是一个很好的练习,这对我来说真的很有用!警告:请注意,只有一个线程/回调一次使用streamreader。