私はSynchronizationContextを使用して、多くのマルチスレッドバックグラウンドタスクを実行するDLLからUIスレッドにイベントをマーシャリングします。
シングルトンパターンがお気に入りではないことは知っていますが、今のところ、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());
}
}
}
}
したがって、このサンプルが十分に理解できることを願っています。