如何处理线程中触发的事件

本文关键字:事件 线程 何处理 处理 | 更新日期: 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实例。这种方法可能不是标准实现,但对我有效。