在 C# 中处理跨线程事件的最佳方法是什么?

本文关键字:最佳 方法 是什么 事件 线程 处理 | 更新日期: 2023-09-27 18:35:41

我正在尝试开发一种从线程触发事件并在主 UI 线程上处理的方法。在事件处理程序中,我将更新 UI,我宁愿不必在任何地方检查 InvokeRequired。

我从搜索中看到了很多关于这一点的信息,但我还没有在任何地方看到一个可以 100% 工作而没有可能出现问题的示例。我提出了一个似乎有效的解决方案,据我所知,它解决了我读到的各种问题。我很想听听人们对此的看法:

public static void SafeInvoke<T>(this EventHandler<T> source, object sender, T args) where T : System.EventArgs
{
    EventHandler<T> handler;
    lock (SyncRoot)
    {
        handler = Volatile.Read(ref source);
    }
    if (handler == null)
    {
        return;
    }
    foreach (Delegate d in handler.GetInvocationList())
    {
        ISynchronizeInvoke target = d.Target as ISynchronizeInvoke;
        if (target == null)
        {
            continue;
        }
        if (target.InvokeRequired)
        {
            target.BeginInvoke(d, new[] { sender, args });
        }
        else
        {
            handler(sender, args);
        }
    }
}

在 C# 中处理跨线程事件的最佳方法是什么?

如果您使用的是 .Net 3.5 或更高版本,则可以使用反应式扩展。 它非常适合这种事情。

http://msdn.microsoft.com/en-us/data/gg577609.aspx