Когда задача PPL выполняется в потоке пользовательского интерфейса?

При вызове create_task есть ли способ гарантировать, что задача не будет выполняться в потоке пользовательского интерфейса?

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


person rysama    schedule 09.05.2015    source источник


Ответы (1)


Функция create_task не будет спонтанно переходить в поток пользовательского интерфейса: если вы не вызовете ее из потока пользовательского интерфейса, она не будет выполняться там. Вам нужно явно вызвать Dispatcher, чтобы вернуться.

Задача с поддержкой апартамента (та, которая возвращает IAsyncAction или IAsyncOperation) по умолчанию будет продолжаться в своем апартаменте, если не указан task_continuation_context, чтобы сообщить ей об обратном. Обычный случай запуска задачи в потоке пользовательского интерфейса продолжится в потоке пользовательского интерфейса.

См. раздел «Управление контекстом потока» в документе MSDN Асинхронное программирование на C++. документы для более подробной информации.

person Rob Caplan - MSFT    schedule 09.05.2015
comment
Если я создам задачу с помощью use_arbitrary, есть ли гарантии, что задача не будет выполняться в потоке пользовательского интерфейса? Документы просто говорят, что ОС будет выбирать; Я хотел бы быть уверен, что он не собирается каким-то образом выбирать поток пользовательского интерфейса. Кроме того, я получаю неожиданные результаты при создании задач в потоке пользовательского интерфейса. Создание задачи в потоке пользовательского интерфейса, а затем вызов ожидания изнутри не приводит к зависанию/сбою приложения, как я ожидал. Это заставляет меня думать, что, несмотря на то, что говорится в документации, вызов create_task в потоке пользовательского интерфейса фактически не выполняет задачу в потоке пользовательского интерфейса (даже если я указал use_current). Это правильно? - person rysama; 09.05.2015
comment
use_arbitrary это просто - любая нить. Если вы не хотите, чтобы это было в потоке пользовательского интерфейса, используйте поток ThreadPool. Пожалуйста, предоставьте пример кода для того, что вы делаете - внутри и внутри неоднозначны без кода. - person Peter Torr - MSFT; 10.05.2015