我发现.NET事件模型是这样的,我经常会在一个线程上引发事件并在另一个线程上侦听它.我想知道将后台线程中的事件编组到我的UI线程的最简洁方法是什么.
根据社区建议,我用过这个:
// earlier in the code mCoolObject.CoolEvent+= new CoolObjectEventHandler(mCoolObject_CoolEvent); // then private void mCoolObject_CoolEvent(object sender, CoolObjectEventArgs args) { if (InvokeRequired) { CoolObjectEventHandler cb = new CoolObjectEventHandler( mCoolObject_CoolEvent); Invoke(cb, new object[] { sender, args }); return; } // do the dirty work of my method here }
Domenic.. 43
我在网上有一些代码.它比其他建议好得多; 绝对检查一下.
样品用法:
private void mCoolObject_CoolEvent(object sender, CoolObjectEventArgs args) { // You could use "() =>" in place of "delegate"; it's a style choice. this.Invoke(delegate { // Do the dirty work of my method here. }); }
Shaun Austin.. 27
几点意见:
不要在类似的代码中显式创建简单的委托,除非你是pre-2.0,所以你可以使用:
BeginInvoke(new EventHandler(mCoolObject_CoolEvent),
sender,
args);
此外,您不需要创建和填充对象数组,因为args参数是"params"类型,因此您只需传入列表即可.
我可能会赞成Invoke
,BeginInvoke
因为后者将导致代码被异步调用,这可能会或可能不是你所追求的,但会使后续异常难以传播而不需要调用EndInvoke
.会发生什么事情,你的应用程序将最终得到一个TargetInvocationException
.
Konrad Rudol.. 10
我避免冗余的代表声明.
private void mCoolObject_CoolEvent(object sender, CoolObjectEventArgs args) { if (InvokeRequired) { Invoke(new Action
对于非事件,您可以使用System.Windows.Forms.MethodInvoker
委托或System.Action
.
编辑:此外,每个事件都有一个相应的EventHandler
代表,所以根本不需要重新声明一个.
我在网上有一些代码.它比其他建议好得多; 绝对检查一下.
样品用法:
private void mCoolObject_CoolEvent(object sender, CoolObjectEventArgs args) { // You could use "() =>" in place of "delegate"; it's a style choice. this.Invoke(delegate { // Do the dirty work of my method here. }); }
几点意见:
不要在类似的代码中显式创建简单的委托,除非你是pre-2.0,所以你可以使用:
BeginInvoke(new EventHandler(mCoolObject_CoolEvent),
sender,
args);
此外,您不需要创建和填充对象数组,因为args参数是"params"类型,因此您只需传入列表即可.
我可能会赞成Invoke
,BeginInvoke
因为后者将导致代码被异步调用,这可能会或可能不是你所追求的,但会使后续异常难以传播而不需要调用EndInvoke
.会发生什么事情,你的应用程序将最终得到一个TargetInvocationException
.
我避免冗余的代表声明.
private void mCoolObject_CoolEvent(object sender, CoolObjectEventArgs args) { if (InvokeRequired) { Invoke(new Action
对于非事件,您可以使用System.Windows.Forms.MethodInvoker
委托或System.Action
.
编辑:此外,每个事件都有一个相应的EventHandler
代表,所以根本不需要重新声明一个.