我使用一些委托和事件来实现NamedPipes,如下所示:
public delegate void MessageReceivedHandler(byte[] message, Client client);
public event MessageReceivedHandler MessageReceived;
void ListenForClients() {
//Do some
Thread readThread = new Thread(Read) { IsBackground = true };
}
void Read(object clientObj) {
//Do Some
if(MessageReceived != null)
MessageReceived(ms.ToArray(),client);
}
当我在Form Class(继承自Control对象)中使用此事件时,实现是:
public partial class Form1 : Form {
public Form1(){
pipeServer.MessageReceived += pipeServer_MessageReceived;
}
void pipeServer_MessageReceived(byte[] message, PipeServer.Client client) {
Invoke(new PipeServer.MessageReceivedHandler(Do_pipeServer_MessageReceived),
new object[] { message, client });
}
public void Do_pipeServer_MessageReceived(byte[] message, PipeServer.Client client) {
// Do Some
}
}
但是当我想在其他一些不从控制对象继承的类中使用它时,我不能Invoke
任何方法,而且我也无法在Invoker方法中替换目标方法Do_pipeServer_MessageReceived
的实现{ {1}}会引发异常,那你的建议是什么?
答案 0 :(得分:3)
有两种可能性:你需要在GUI线程上调用回调,否则就不需要。
如果您没有触摸该回调中的GUI,则不要打扰调用。
如果你做触摸GUI,那么你必须根据定义引用你正在更新的某些控件。在该控件上调用Invoke
。你调用Invoke的控件真的无关紧要;他们都会做同样的事情。