使用Timer
个对象,我可以设置SynchronizingObject
属性,以避免在从计时器的事件处理程序更新GUI时使用调用。如果我有一个类而不是订阅事件并且必须在事件处理程序中更新GUI,那么是否有类似的概念?或者我是否必须编写InvokeRequired样板代码?
答案 0 :(得分:3)
SynchronizingObject
只是ISynchronizeInvoke
属性。 (例如,该接口由WinForms控件实现。)
您可以自己使用相同的界面,但是如果使用vanilla事件,则无法真正指定同步对象。
你可以做的是编写一个实用程序方法,该方法接受委托和ISynchronizeInvoke
,并返回一个委托,确保原始委托在正确的线程上运行。
例如:
public static EventHandler<T> Wrap<T>(EventHandler<T> 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);
}
};
}
答案 1 :(得分:-1)
您可以查看BackgroundWorker课程。