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


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

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

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

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

Я получаю исключение InvalidOperationException с

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

2 67

2 ответа:

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

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

var scheduler = TaskScheduler.FromCurrentSynchronizationContext();

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

для любых будущих посетителей, которые приходят в поисках реального намерения вопроса: