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