Как создать задачу (TPL), выполняющую поток STA? - PullRequest
72 голосов
/ 12 мая 2011

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

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

Как сделать то же самое, используя Tasks в приложении WPF?Вот некоторый код:

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

Я получаю InvalidOperationException с

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

Ответы [ 2 ]

72 голосов
/ 12 мая 2011

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

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

var scheduler = TaskScheduler.FromCurrentSynchronizationContext();

Task.Factory.StartNew(...)
            .ContinueWith(r => AddControlsToGrid(r.Result), scheduler);
31 голосов
/ 22 апреля 2014

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

...