我有一个应用程序,有几个方法。它们基本上是按钮点击事件和计时器事件。当我点击一个按钮或几秒钟后,计时器或按钮发送一条消息(我想是TCP消息)并立即等待另一个应用程序的回答。我使用StreamWriter.Write()
和StreamReader.Read()
作为消息和答案。 (我认为他们创建并接受TCP字符串消息)。
但也有意想不到的消息,什么可以随时到达我的应用程序。我不知道怎么收到它们。
创意1:在每StreamReader.Read()
之后,为可能发生意外消息的情况做好准备。但这似乎是个坏主意。尽管发送和读取消息经常发生,但在每个地方修改代码似乎都是一个奇怪的解决方案。
理念2:使用线程。它将接受StreamReader.Read()
的每个传入消息。但在我的主线程中,我需要删除StreamReader.Read()
方法,只需等待其他线程的答案。这会发生在while(我没有得到答案){},这似乎也是一个糟糕的解决方案。
创意3:使用事件处理程序?我从来没有使用过这个,所以我对如何使用事件来完成这项任务感到困惑。
还有其他想法吗?
答案 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。