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

时间:2012-01-10 06:12:49

标签: c# events delegates invoke named-pipes

我问类似的问题here我使用this sample以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());

  }

}

所以在win形式中我们使用它:

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,是否有人知道控制台应用程序中的实现是什么?

3 个答案:

答案 0 :(得分:2)

你应该看看SynchronizationContext。基本上,你需要在主线程中使用某种主循环来处理这些事件。

在此处详细了解:http://www.codeproject.com/KB/threads/SynchronizationContext.aspx

答案 1 :(得分:0)

在Windows窗体中使用Invoke在GUI线程上执行。但由于控制台应用程序没有GUI,因此不提供Invoke。关于哪个线程执行事件处理程序真的很重要吗?

答案 2 :(得分:0)

最后,我发现对于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的一个实例。这种方法可能不是标准实现,但对我有用。