В настоящее время я работаю над в основном асинхронным приложением, которое повсюду использует TAP. Каждый класс, у которого есть методы для порождения Task
s, также имеет внедренный в него TaskScheduler
. Это позволяет нам выполнять явное планирование задач, что, как я понимаю, не то, что Microsoft делает с Async CTP.
Единственная проблема, с которой я столкнулся с новым подходом (неявное планирование), заключается в том, что наша предыдущая философия всегда заключалась в том, что «мы знаем, что продолжение всегда будет указывать свой планировщик задач, поэтому нам не нужно беспокоиться о том, в каком контексте мы завершаем задача по ".
Отход от этого немного беспокоит нас только потому, что он отлично сработал с точки зрения избежания тонких ошибок потоковой передачи, потому что для каждого бита кода мы можем видеть, что кодер не забыл учитывать, в каком потоке он находится. Если они не указали планировщик задач, это ошибка.
Вопрос 1: Может ли кто-нибудь меня убедить, что неявный подход - хорошая идея? Я вижу так много проблем, возникающих из-за ConfigureAwait (false) и явного планирования в устаревшем / стороннем коде. Как я могу быть уверен, что мой «ожидающий» код всегда выполняется в потоке пользовательского интерфейса, например?
Вопрос 2: Итак, предполагая, что мы удалим все TaskScheduler
DI из нашего кода и начать использовать неявное планирование, как тогда установить планировщик задач по умолчанию? А как насчет изменения планировщика на полпути к методу, непосредственно перед ожиданием дорогостоящего метода, а затем снова его вернуть обратно?
(ps Я уже читал http://msmvps.com/blogs/jon_skeet/archive/ 02/11/02 / configuring-wait.aspx )