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

时间:2013-10-15 19:10:31

标签: c# .net multithreading events invoke

我正在尝试开发一种方法来从一个线程触发事件然后在主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);
        }
    }
}

1 个答案:

答案 0 :(得分:-1)

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

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