【发布时间】:2023-04-11 04:39:01
【问题描述】:
使用Timer 对象,我可以设置SynchronizingObject 属性以避免在从计时器的事件处理程序更新GUI 时使用invoke。如果我有一个订阅事件的类并且必须在事件处理程序中更新 GUI,是否有类似的概念?还是我必须编写 InvokeRequired 样板代码?
【问题讨论】:
标签: c# user-interface events multithreading
使用Timer 对象,我可以设置SynchronizingObject 属性以避免在从计时器的事件处理程序更新GUI 时使用invoke。如果我有一个订阅事件的类并且必须在事件处理程序中更新 GUI,是否有类似的概念?还是我必须编写 InvokeRequired 样板代码?
【问题讨论】:
标签: c# user-interface events multithreading
SynchronizingObject 只是一个 ISynchronizeInvoke 属性。 (例如,该接口由 WinForms 控件实现。)
您可以自己使用相同的接口,尽管使用普通事件无法真正指定同步对象。
您可以做的是编写一个实用方法,它接受一个委托和一个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);
}
};
}
【讨论】:
你可以看看BackgroundWorker 类。
【讨论】: