Как создать задачу (TPL), использующую поток STA?

Использование Thread довольно просто

 Thread thread = new Thread(MethodWhichRequiresSTA);
 thread.SetApartmentState(ApartmentState.STA);  

Как выполнить то же самое с помощью задач в приложении WPF? Вот какой код:

Task.Factory.StartNew
  (
    () => 
    {return "some Text";}
  )
   .ContinueWith(r => AddControlsToGrid(r.Result));  

Я получаю InvalidOperationException с

Вызывающий поток должен быть STA, потому что для этого требуются многие компоненты пользовательского интерфейса.

Ответ 1

Вы можете использовать TaskScheduler.FromCurrentSynchronizationContext Method, чтобы получить TaskScheduler для текущего контекста синхронизации (который является диспетчером WPF при запуске приложения WPF).

Затем используйте ContinueWith перегрузку, которая принимает TaskScheduler:

var scheduler = TaskScheduler.FromCurrentSynchronizationContext();

Task.Factory.StartNew(...)
            .ContinueWith(r => AddControlsToGrid(r.Result), scheduler);