Я пытаюсь понять цель TaskCompletionSource
и ее отношение к работе async/threadless. Я думаю, что у меня есть общая идея, но я хочу убедиться, что мое понимание верное.
Сначала я начал изучать параллельную библиотеку задач (TPL), чтобы выяснить, был ли хороший способ создать свою собственную работу без потоков/асинхронных операций (скажем, вы пытаетесь улучшить масштабируемость вашего сайта ASP.NET) и понимаете TPL выглядит так, что это будет очень важно в будущем (async
/await
). Это привело меня к TaskCompletionSource
.
С моей точки зрения, похоже, что добавление TaskCompletionSource
к одному из ваших классов на самом деле не так сильно влияет на создание асинхронного кодирования; если вы все еще выполняете код синхронизации, вызов вашего кода будет заблокирован. Я думаю, что это справедливо и для API-интерфейсов Microsoft. Например, скажем, в DownloadStringTaskAsync
off класса WebClient
, любой код установки/синхронизации, который они выполняют, будет блокироваться. Код, который вы выполняете, должен запускаться в каком-то потоке, либо в текущем потоке, либо вам придется откручивать новый.
Таким образом, вы используете TaskCompletionSource
в своем собственном коде, когда вы вызываете другие вызовы async
от Microsoft, поэтому клиенту ваших классов не нужно создавать новый поток для вашего класса, чтобы он не блокировался.
Не знаете, как Microsoft внутренне выполняет свои асинхронные API. Например, существует новый async
метод SqlDataReader
для .Net 4.5. Я знаю, что есть порты ввода-вывода IO. Я думаю, что это абстракция более низкого уровня (С++?), Которая, вероятно, большинство разработчиков С# не будет использовать. Не уверен, что завершение ввода IO портов будет работать для сетевых или сетевых вызовов (HTTP) или если оно используется только для файла IO.
Итак, вопрос в том, правильно ли я в своем понимании правильно? Есть ли определенные вещи, которые я представил неправильно?