我正在使用一个在独立线程中运行其自己的事件分派器的框架。该框架可能会产生一些事件。C#中的交叉线程事件处理
class SomeDataSource {
public event OnFrameworkEvent;
void FrameworkCallback() {
// This function runs on framework's thread.
if (OnFrameworkEvent != null)
OnFrameworkEvent(args);
}
}
我想将这些事件传递给Winforms线程上的Winforms对象。我明显检查了InvokeRequired
,并在必要时将其分派给Winforms线程。
class SomeForm : Form {
// ...
public void SomeAction(SomeArgs args) {
if (InvokeRequired) {
BeginInvoke(new Action(SomeAction), args);
return;
}
// ...
}
}
现在,当窗体处于被关闭,这会导致各种问题的过程事件可以传递的,所以我注销从框架的事件源窗体的事件处理程序上的WinForms线程这样的:
var form = new SomeForm();
var src = new SomeDataSource();
// ...
src.OnFrameworkEvent += form.SomeAction;
form.Closing += (sender, eargs) => src.OnFrameworkEvent -= form.SomeAction;
现在,这种方法是线程安全的吗?如果表单正在关闭过程中,并且外部线程调用
BeginInvoke
,那么如果表单关闭,调用是否仍然会排队等待执行? (这意味着我仍然有机会遇到相同的问题)是否有更好的方法或推荐的模式用于跨线程事件处理?
我喜欢这种方法。我喜欢在线程完成时使用回调方法。 – 2010-01-29 18:46:21