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类。