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?

questionAnswers(2)

yourAnswerToTheQuestion