Cada postagem de blog que eu li mostra como consumir um método assíncrono em C #, mas, por algum motivo estranho, nunca explique como criar seus próprios métodos assíncronos para consumir. Então, eu tenho esse código agora que consome meu método:
private async void button1_Click(object sender, EventArgs e)
{
var now = await CountToAsync(1000);
label1.Text = now.ToString();
}
E eu escrevi este método que é CountToAsync
:
private Task<DateTime> CountToAsync(int num = 1000)
{
return Task.Factory.StartNew(() =>
{
for (int i = 0; i < num; i++)
{
Console.WriteLine("#{0}", i);
}
}).ContinueWith(x => DateTime.Now);
}
Essa é Task.Factory
a melhor maneira de escrever um método assíncrono ou devo escrever de outra maneira?
c#
async-await
c#-5.0
Khalid Abuhakmeh
fonte
fonte
Respostas:
Eu não recomendo, a
StartNew
menos que você precise desse nível de complexidade.Se o seu método assíncrono depende de outros métodos assíncronos, a abordagem mais fácil é usar a
async
palavra-chave:Se o seu método assíncrono estiver executando o trabalho da CPU, você deve usar
Task.Run
:Você pode achar minha
async
/await
introdução útil.fonte
TaskFactory.FromAsync
para embrulharBeginInvoke
. Não sabe ao certo o que você quer dizer com "código de retorno de chamada"; fique à vontade para postar sua própria pergunta com código.Task.Delay
retornos?await
é uma "espera assíncrona", portanto, não prossegue para a próxima iteração até que a tarefa retornada sejaTask.Delay
concluída.Se você não quis usar async / waitit dentro do seu método, mas ainda o "decorou" para poder usar a palavra-chave wait de fora, TaskCompletionSource.cs :
Daqui e aqui
Eu vi também é usado na fonte .NET, por exemplo. WebClient.cs :
Finalmente, achei útil também o seguinte:
Introdução ao Async / Await no ASP.NET
Se o objetivo é melhorar a escalabilidade (em vez de capacidade de resposta), tudo depende da existência de uma E / S externa que forneça a oportunidade de fazer isso.
fonte
Uma maneira muito simples de tornar um método assíncrono é usar o método Task.Yield (). Como o MSDN declara:
Insira-o no início do seu método e ele retornará imediatamente ao chamador e concluirá o restante do método em outro thread.
fonte
Task.Yield()
é realmente útil, para os casos que você deseja garantir que o retornadoTask
não será imediatamente completado após a criação.