Как создать задачу (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);
Ответ 2
Для любых будущих посетителей, которые ищут реальную цель вопроса: