[Test]
public void A()
{
var d = Dispatcher.CurrentDispatcher;
Action action = () => Console.WriteLine("Dispatcher invoked me!");
var worker = new BackgroundWorker();
worker.DoWork += SomeWork;
//worker.RunWorkerAsync( (Action) delegate { Console.WriteLine("This works!"); } );
worker.RunWorkerAsync((Action) delegate { d.Invoke(action); } );
System.Threading.Thread.Sleep(2500);
}
private void SomeWork(object sender, DoWorkEventArgs e)
{
(e.Argument as Action)();
}
Этот блок кода не вызывает исключение. В то же время Dispatcher.Invoke ничего не делает. Я нашел это странным.
Я извлек вспомогательный метод в базовую ViewModel. Рабочие потоки использовали этот метод DoOnUIThread (), чтобы избежать проблемы схождения потоков.
Однако в моих модульных тестах я обнаружил, что попытка проверить объекты модели представления приводит к сбоям из-за вышеуказанной проблемы.
Я мог бы перевести все это поведение в подключаемую зависимость, которую я мог бы заменить в своих тестах. например ViewModelBase зависит от UIThreadExecutor.Execute (Action), и я использую подделку, которая просто вызывает действие в моих тестах. Однако мне любопытно, почему Dispatcher ведет себя так, как он ..