Как заставить задачу НЕ выполняться в потоке пользовательского интерфейса
Следующий код является упрощением кода в реальном приложении. Проблема ниже в том, что в фоновом потоке будет выполняться большая работа, а не в фоновом потоке.
void Do()
{
Debug.Assert(this.Dispatcher.CheckAccess() == true);
Task.Factory.StartNew(ShortUIWork, CancellationToken.None, TaskCreationOptions.None, TaskScheduler.FromCurrentSynchronizationContext());
}
void ShortUIWork()
{
Debug.Assert(this.Dispatcher.CheckAccess() == true);
Task.Factory.StartNew(LongWork, TaskCreationOptions.LongRunning);
}
void LongWork()
{
Debug.Assert(this.Dispatcher.CheckAccess() == false);
Thread.Sleep(1000);
}
Так что Do () обычно вызывается из контекста пользовательского интерфейса. И так же ShortUIWork, как определено TaskScheduler. Однако LongWork также вызывается в потоке пользовательского интерфейса, который, конечно, блокирует пользовательский интерфейс.
Как обеспечить, чтобы задача не выполнялась в потоке пользовательского интерфейса?