我正在使用 SynchronizationContext 将事件从我的 DLL 编组回 UI 线程,该 DLL 执行大量多线程后台任务。
我知道单例模式不是最喜欢的,但我现在使用它来在创建 foo 的父对象时存储 UI 的 SynchronizationContext 的引用。
public class Foo
{
public event EventHandler FooDoDoneEvent;
public void DoFoo()
{
//stuff
OnFooDoDone();
}
private void OnFooDoDone()
{
if (FooDoDoneEvent != null)
{
if (TheUISync.Instance.UISync != SynchronizationContext.Current)
{
TheUISync.Instance.UISync.Post(delegate { OnFooDoDone(); }, null);
}
else
{
FooDoDoneEvent(this, new EventArgs());
}
}
}
}
这在 WPF 中根本不起作用,TheUISync 实例 UI 同步(从主窗口提供)永远不会匹配当前的 SynchronizationContext.Current。在 Windows 窗体中,当我做同样的事情时,它们将在调用后匹配,我们将回到正确的线程。
我讨厌的修复看起来像
public class Foo
{
public event EventHandler FooDoDoneEvent;
public void DoFoo()
{
//stuff
OnFooDoDone(false);
}
private void OnFooDoDone(bool invoked)
{
if (FooDoDoneEvent != null)
{
if ((TheUISync.Instance.UISync != SynchronizationContext.Current) && (!invoked))
{
TheUISync.Instance.UISync.Post(delegate { OnFooDoDone(true); }, null);
}
else
{
FooDoDoneEvent(this, new EventArgs());
}
}
}
}
所以我希望这个示例足够有意义。