如何在 c# 中捕获意外消息,同时我发送消息并且我还想接受消息的答案?
How to catch unexpected messages in c#, while I send messages and I also want to accept answers for the messages?
我有一个应用程序,有几个方法。它们基本上是按钮单击事件和计时器事件。当我点击一个按钮或几秒钟过去时,计时器或按钮发送一条消息(我认为是 TCP 消息)并立即等待另一个应用程序的回答。我使用 StreamWriter.Write()
和 StreamReader.Read()
作为消息和答案。 (我认为他们创建并接受 TCP 字符串消息)。
但也有意想不到的消息,什么可以随时到达我的应用程序。我不知道如何接收它们。
想法 1:在每 StreamReader.Read()
之后,为意外消息的到来做好准备。但这似乎是个坏主意。虽然发送和读取消息发生的频率很高,但是在每个地方都修改代码似乎是一个有点奇怪的解决方案。
思路二:使用线程。它会接受每个带有 StreamReader.Read()
的传入消息。但是在我的主线程中,我需要删除 StreamReader.Read()
方法并简单地等待来自另一个线程的答案。 while(I don’t get the answer){} 会发生这种情况,这似乎也是一个糟糕的解决方案。
想法 3:使用事件处理程序?我从来没有为此使用过任何东西,所以我对如何使用事件来完成这项任务感到有点困惑。
还有其他想法吗?
您的应用是否允许延迟读取答案?如果我做对了,您的应用程序可以向带有按钮的对象发送消息,也可以从中接收消息,有时来自该请求,有时是自发的。
我想到的最直接的事情,也许不是最好的,是一个投票查看线程。
创建一个循环直到满足条件(如关闭通信)并引发事件并等待确认的线程
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
}
很酷的效果是它也适用于按钮发送请求的答案,因此您甚至不必立即阅读答案。这将是了解事件和事件处理程序的一个很好的练习,它们对我来说非常有用!警告:注意一次只能有一个 thread/callback 使用 streamreader。
我有一个应用程序,有几个方法。它们基本上是按钮单击事件和计时器事件。当我点击一个按钮或几秒钟过去时,计时器或按钮发送一条消息(我认为是 TCP 消息)并立即等待另一个应用程序的回答。我使用 StreamWriter.Write()
和 StreamReader.Read()
作为消息和答案。 (我认为他们创建并接受 TCP 字符串消息)。
但也有意想不到的消息,什么可以随时到达我的应用程序。我不知道如何接收它们。
想法 1:在每 StreamReader.Read()
之后,为意外消息的到来做好准备。但这似乎是个坏主意。虽然发送和读取消息发生的频率很高,但是在每个地方都修改代码似乎是一个有点奇怪的解决方案。
思路二:使用线程。它会接受每个带有 StreamReader.Read()
的传入消息。但是在我的主线程中,我需要删除 StreamReader.Read()
方法并简单地等待来自另一个线程的答案。 while(I don’t get the answer){} 会发生这种情况,这似乎也是一个糟糕的解决方案。
想法 3:使用事件处理程序?我从来没有为此使用过任何东西,所以我对如何使用事件来完成这项任务感到有点困惑。
还有其他想法吗?
您的应用是否允许延迟读取答案?如果我做对了,您的应用程序可以向带有按钮的对象发送消息,也可以从中接收消息,有时来自该请求,有时是自发的。
我想到的最直接的事情,也许不是最好的,是一个投票查看线程。
创建一个循环直到满足条件(如关闭通信)并引发事件并等待确认的线程
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
}
很酷的效果是它也适用于按钮发送请求的答案,因此您甚至不必立即阅读答案。这将是了解事件和事件处理程序的一个很好的练习,它们对我来说非常有用!警告:注意一次只能有一个 thread/callback 使用 streamreader。