我正在尝试开发一种从线程触发事件并在主 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);
}
}
}