SynchronizeObject用于事件

使用Timer对象,我可以设置SynchronizingObject属性,以避免在从计时器的事件处理程序更新GUI时使用invoke。 如果我有一个类而不是订阅事件并且必须在事件处理程序中更新GUI,那么是否有类似的概念? 或者我是否必须编写InvokeRequired样板代码?

SynchronizingObject只是一个ISynchronizeInvoke属性。 (例如,该接口由WinForms控件实现。)

您可以自己使用相同的界面,尽管有一个vanilla事件,但无法真正指定同步对象。

可以做的是编写一个实用程序方法,它接受委托和ISynchronizeInvoke ,并返回一个委托,确保原始委托在正确的线程上运行。

例如:

 public static EventHandler Wrap(EventHandler original, ISynchronizeInvoke synchronizingObject) where T : EventArgs { return (object sender, T args) => { if (synchronizingObject.InvokeRequired) { synchronizingObject.Invoke(original, new object[] { sender, args }); } else { original(sender, args); } }; } 

您可以查看BackgroundWorker类。