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

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

问题描述:

我有一个应用程序,有什么几个方法。他们基本上是按钮点击事件和计时器事件。当我点击一个按钮或几秒钟后,计时器或按钮发送一条消息(我认为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消息),所以你不清楚你在找什么。 –

是否允许您的应用在延迟后阅读答案?如果我把它弄好了,你的应用程序可以用按钮发送消息给某个东西,并且可以从它那里接收消息,有时是从那个请求中接收消息,有时是自发的。

直接的事情,也许不是最好的,这让我想起了一个轮询预览线程。

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

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