TaskCompletionSource - Tentando entender o trabalho assíncrono sem threads
Estou tentando entender o propósito deTaskCompletionSource
e sua relação com o trabalho assíncrono / sem rosca. Acho que tenho a ideia geral, mas quero ter certeza de que meu entendimento está correto.
Primeiro comecei a examinar a Task Parallel Library (TPL) para descobrir se havia uma boa maneira de criar seu próprio trabalho sem threads / async (digamos que você está tentando melhorar a escalabilidade do seu site ASP.NET), além de entender o TPL parece que será muito importante no futuro (async
/await
). O que me levou aoTaskCompletionSource
.
Pelo que entendi, parece adicionarTaskCompletionSource
para uma de suas aulas não faz muito em fazer sua codificação assíncrona; Se você ainda estiver executando o código de sincronização, a chamada para o seu código será bloqueada. Eu acho que isso é verdade para as APIs da Microsoft. Por exemplo, digamosDownloadStringTaskAsync
fora deWebClient
classe, qualquer código de configuração / sincronização que eles estão fazendo inicialmente irá bloquear. O código que você está executando deve ser executado em algum segmento, seja o segmento atual ou você terá que desmembrar um novo.
Então você usaTaskCompletionSource
no seu próprio código quando você está chamando outraasync
chamadas da Microsoft para que o cliente de suas classes não precise criar um novo segmento para sua classe não bloquear.
Não tenho certeza de como a Microsoft faz suas APIs assíncronas internamente. Por exemplo, há um novoasync
método fora doSqlDataReader
para .Net 4.5. Eu sei que há portas de conclusão de IO. Eu acho que é uma abstração de nível inferior (C ++?) Que provavelmente a maioria dos desenvolvedores de C # não vai usar. Não tenho certeza se as portas de conclusão de E / S funcionarão para chamadas de banco de dados ou de rede (HTTP) ou se apenas usadas para E / S de arquivo.
Então a questão é, estou correto em meu entendimento correto? Há certas coisas que eu representei incorretamente?