【问题标题】:SynchronizingObject for an event事件的同步对象
【发布时间】:2023-04-11 04:39:01
【问题描述】:

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

【问题讨论】:

    标签: c# user-interface events multithreading


    【解决方案1】:

    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);
            }
        };
    }
    

    【讨论】:

    • 当我想与自定义类(不是winforms)同步时,这个类是否适合使用,如下所示:stackoverflow.com/q/10654163/328397
    • @makerofthings7:我不认为这是我在那种情况下会使用的方法,不。如果您使用的是 .NET 4,请查看 TPL 提供的内容。
    【解决方案2】:

    你可以看看BackgroundWorker 类。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-21
      • 2018-03-30
      • 1970-01-01
      • 2019-06-28
      • 2011-12-12
      相关资源
      最近更新 更多