我问类似的问题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,是否有人知道控制台应用程序中的实现是什么?
答案 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的一个实例。这种方法可能不是标准实现,但对我有用。