Я использую SynchronizationContext для переноса событий обратно в поток пользовательского интерфейса из моей DLL, которая выполняет много многопоточных фоновых задач.
Я знаю, что одноэлементный шаблон не является фаворитом, но теперь я использую его для хранения ссылки на интерфейс SynchronizationContext пользовательского интерфейса при создании родительского объекта foo.
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 (которая является фидом из главного окна) никогда не соответствует текущему SynchronizationContext.Current. В форме окна, когда я делаю то же самое, они будут совпадать после вызова, и мы вернемся к правильной теме.
Мое исправление, которое я ненавижу, выглядит как
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());
}
}
}
}
Поэтому я надеюсь, что этот образец будет иметь смысл следовать.