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

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

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

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

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

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

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

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

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

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

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

  • Использование StaTaskScheduler как указано в этом ответе
  • Версия DIY: установите ApartmentState в задаче
  • оператор присваивания '=' атомный?
  • Нужно ли блокировать или маркировать как изменчивые при доступе к простому булевому флагом в C #?
  • Как поставить задачу для сна (или задержки) в C # 4.0?
  • WPF загружает анимацию в отдельный stream пользовательского интерфейса? (С #)
  • Чтение и запись C ++ int Atomic?
  • Какие операции являются атомарными в C #?
  • Почему объект блокировки должен быть статическим?
  • Почему блокировка (это) {...} плохая?
  • Давайте будем гением компьютера.