Как создать задачу (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 ответа:
можно использовать TaskScheduler.Метод FromCurrentSynchronizationContext и TaskScheduler для текущего контекста синхронизации (который является диспетчером WPF при запуске приложения WPF).
затем использовать ContinueWith перегрузка, которая принимает TaskScheduler:
var scheduler = TaskScheduler.FromCurrentSynchronizationContext(); Task.Factory.StartNew(...) .ContinueWith(r => AddControlsToGrid(r.Result), scheduler);
для любых будущих посетителей, которые приходят в поисках реального намерения вопроса:
- используя
StaTaskScheduler
как указано в этой ответ- DIY версия: установить ApartmentState на Задачу