如何处理线程中触发的事件
本文关键字:事件 线程 何处理 处理 | 更新日期: 2023-09-27 18:19:56
我在这里问了类似的问题,我使用这个示例以win形式实现namedpipes,但现在我需要在控制台应用程序中运行它,所以在处理事件时存在问题,在原始代码中,一些事件在一些线程中声明和触发,如下所示:
public class PipeServer {
public delegate void MessageReceivedHandler(byte[] message)
public event MessageReceivedHandler MessageReceived;
void ListenForClients() {
//Some code
Thread readThread = new Thread(Read) { IsBackground = true };
}
void Read(object clientObj) {
//Some Code
if(MessageReceived != null)
MessageReceived(ms.ToArray());
}
}
因此,在获胜形式中,我们这样使用它:
public partial class Form1 : Form {
private PipeServer pipeServer = new PipeServer();
public Form1(){
pipeServer.MessageReceived += pipeServer_MessageReceived;
}
void pipeServer_MessageReceived(byte[] message) {
Invoke(new PipeServer.MessageReceivedHandler(Do_pipeServer_MessageReceived),
new object[] { message });
}
public void Do_pipeServer_MessageReceived(byte[] message ) {
//Do Job
}
所以当我使用控制台应用程序时,我不能使用Invoke,有人知道控制台应用程序中的实现是什么吗?
您应该看看SynchronizationContext
。从本质上讲,您需要在主线程中使用某种主循环来处理这些事件。
点击此处了解更多信息:http://www.codeproject.com/KB/threads/SynchronizationContext.aspx
Invoke在Windows窗体中用于在GUI线程上执行。但由于Console应用程序并没有GUI,所以不提供Invoke。哪个线程执行事件处理程序真的重要吗?
最后,我发现对于在PipeServer class
中触发的每个事件,我都会删除该事件,并用处理程序(onevent)
替换,因此上面的示例如下所示:
public class PipeServer {
void ListenForClients() {
//Some code
Thread readThread = new Thread(Read) { IsBackground = true };
}
void Read(object clientObj) {
//Some Code
MessageReceived(ms.ToArray());
}
void MessageReceived(byte[] message){
//Do Job
}
}
并为PipeServer class
添加了一个构造函数以用于所需的实现,最后只需声明一个PipeServer实例。这种方法可能不是标准实现,但对我有效。