Chaque article de blog que j'ai lu vous indique comment utiliser une méthode asynchrone en C #, mais pour une raison étrange, n'expliquez jamais comment créer vos propres méthodes asynchrones à consommer. J'ai donc ce code en ce moment qui consomme ma méthode:
private async void button1_Click(object sender, EventArgs e)
{
var now = await CountToAsync(1000);
label1.Text = now.ToString();
}
Et j'ai écrit cette méthode qui est 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);
}
Est-ce, l'utilisation de Task.Factory
, la meilleure façon d'écrire une méthode asynchrone, ou devrais-je l'écrire d'une autre manière?
c#
async-await
c#-5.0
Khalid Abuhakmeh
la source
la source
Réponses:
Je ne recommande pas
StartNew
sauf si vous avez besoin de ce niveau de complexité.Si votre méthode async dépend d'autres méthodes async, l'approche la plus simple consiste à utiliser le
async
mot - clé:Si votre méthode asynchrone effectue un travail sur le processeur, vous devez utiliser
Task.Run
:Vous trouverez peut-être mon
async
/await
intro utile.la source
TaskFactory.FromAsync
pour envelopperBeginInvoke
. Je ne sais pas ce que vous entendez par "code de rappel"; n'hésitez pas à poster votre propre question avec du code.Task.Delay
retours?await
est une "attente asynchrone", donc il ne passe à l'itération suivante qu'après la fin de la tâche retournée parTask.Delay
.Si vous ne vouliez pas utiliser async / await dans votre méthode, mais que vous la "décorez" de manière à pouvoir utiliser le mot-clé await de l'extérieur, TaskCompletionSource.cs :
D'ici et d' ici
J'ai vu est également utilisé dans la source .NET, par exemple. WebClient.cs :
Enfin, j'ai trouvé utile aussi ce qui suit:
Introduction à Async / Await sur ASP.NET
Si l'objectif est d'améliorer l'évolutivité (plutôt que la réactivité), tout repose sur l'existence d'une E / S externe qui offre la possibilité de le faire.
la source
Un moyen très simple de rendre une méthode asynchrone consiste à utiliser la méthode Task.Yield (). Comme l'indique MSDN:
Insérez-le au début de votre méthode et il reviendra alors immédiatement à l'appelant et terminera le reste de la méthode sur un autre thread.
la source
Task.Yield()
est en effet utile, pour les cas où vous souhaitez vous assurer que le renduTask
ne sera pas immédiatement terminé lors de la création.