【发布时间】:2010-01-29 00:45:10
【问题描述】:
我正在使用一个框架,该框架在单独的线程中运行自己的事件调度程序。框架可能会产生一些事件。
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;
-
1234563如果表格已关闭? (这意味着我仍有机会遇到同样的问题)
是否有更好的方法或推荐的跨线程事件处理模式?
【问题讨论】:
标签: c# winforms multithreading event-handling