Eu pensei que eles eram basicamente a mesma coisa - escrever programas que dividem tarefas entre processadores (em máquinas com mais de 2 processadores). Então eu estou lendo isso , que diz:
Os métodos assíncronos devem ser operações sem bloqueio. Uma expressão de espera em um método assíncrono não bloqueia o encadeamento atual enquanto a tarefa aguardada está em execução. Em vez disso, a expressão inscreve o restante do método como uma continuação e retorna o controle para o chamador do método assíncrono.
As palavras-chave assíncronas e aguardam não fazem com que threads adicionais sejam criados. Os métodos assíncronos não requerem multithreading porque um método assíncrono não é executado em seu próprio encadeamento. O método é executado no contexto de sincronização atual e usa o tempo no encadeamento apenas quando o método está ativo. Você pode usar o Task.Run para mover o trabalho vinculado à CPU para um encadeamento em segundo plano, mas um encadeamento em segundo plano não ajuda em um processo que está apenas aguardando a disponibilização dos resultados.
e estou pensando se alguém pode traduzir isso para o inglês para mim. Parece fazer uma distinção entre assincronicidade (isso é uma palavra?) E encadeamento e implica que você pode ter um programa que possui tarefas assíncronas, mas sem multithreading.
Agora entendo a ideia de tarefas assíncronas, como o exemplo na pág. 467 de C # de Jon Skeet em profundidade, terceira edição
async void DisplayWebsiteLength ( object sender, EventArgs e )
{
label.Text = "Fetching ...";
using ( HttpClient client = new HttpClient() )
{
Task<string> task = client.GetStringAsync("http://csharpindepth.com");
string text = await task;
label.Text = text.Length.ToString();
}
}
A async
palavra-chave significa " Esta função, sempre que for chamada, não será chamada em um contexto em que sua conclusão seja necessária para que tudo após a chamada seja chamada".
Em outras palavras, escrevê-lo no meio de alguma tarefa
int x = 5;
DisplayWebsiteLength();
double y = Math.Pow((double)x,2000.0);
, já DisplayWebsiteLength()
que não tem nada a ver com x
ou y
, fará com DisplayWebsiteLength()
que seja executado "em segundo plano", como
processor 1 | processor 2
-------------------------------------------------------------------
int x = 5; | DisplayWebsiteLength()
double y = Math.Pow((double)x,2000.0); |
Obviamente, esse é um exemplo estúpido, mas estou correto ou totalmente confuso ou o quê?
(Além disso, estou confuso sobre o porquê sender
e e
nunca é usado no corpo da função acima.)
sender
e e
estão sugerindo que esse é realmente um manipulador de eventos - praticamente o único lugar onde async void
é desejável. Provavelmente, isso é chamado com o clique de um botão ou algo parecido - o resultado é que essa ação ocorre completamente de forma assíncrona em relação ao restante do aplicativo. Mas ainda está tudo em um encadeamento - o encadeamento da interface do usuário (com um pequeno intervalo de tempo em um encadeamento IOCP que lança o retorno de chamada no encadeamento da interface do usuário).
DisplayWebsiteLength
exemplo de código: Você não deve usar HttpClient
em uma using
instrução - Sob uma carga pesada, o código pode esgotar o número de soquetes disponíveis, resultando em erros de SocketException. Mais informações sobre instanciação imprópria .