Как создать задачу (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 с
- Записи чтения / записи в C ++
- Может ли num ++ быть атомарным для 'int num'?
- Насколько дорого стоит инструкция блокировки?
- Блокировки повторного входа в C #
- Как сделать блокировку с несколькими чтениями / одиночной записью из более простых примитивов синхронизации?
Вызывающий stream должен быть STA, потому что для этого требуется множество компонентов пользовательского интерфейса.
- Использование SynchronizationContext для отправки событий обратно в пользовательский интерфейс для WinForms или WPF
- Является ли NodeJS действительно однопоточным?
- Выполнение задачи в фоновом режиме в приложении WPF
- C # ручная блокировка / разблокировка
- Java Thread Мусор собран или нет
- C ++ 11 std :: mutex в тупике Visual Studio 2012 при блокировке из DllMain ()
- Пример / учебник Mutex?
- java.lang.OutOfMemoryError: пространство кучи Java
Вы можете использовать метод TaskScheduler.FromCurrentSynchronizationContext для получения TaskScheduler для текущего контекста синхронизации (который является диспетчером WPF при запуске приложения WPF).
Затем используйте ContinueWith перегрузку, которая принимает TaskScheduler:
var scheduler = TaskScheduler.FromCurrentSynchronizationContext(); Task.Factory.StartNew(...) .ContinueWith(r => AddControlsToGrid(r.Result), scheduler);
Для будущих посетителей, которые ищут реальную цель вопроса:
- Использование
StaTaskScheduler
как указано в этом ответе - Версия DIY: установите ApartmentState в задаче