SynchronizeObject用于事件

时间:2009-12-03 17:02:16

标签: c# user-interface events multithreading

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

2 个答案:

答案 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课程。