web-dev-qa-db-fra.com

Comment utiliser des méthodes / classes statiques dans les opérations asynchrones / en attente?

C'est mon approche de ne pas utiliser de méthodes et de classes statiques dans les opérations asynchrones - à moins qu'une technique de verrouillage ne soit implémentée pour empêcher les conditions de concurrence.

Désormais, async/wait a été introduit dans le cadre c # 4.5+ - ce qui simplifie les applications multithread et encourage l'interface utilisateur réactive.

Cependant - comme un verrou ne peut/ne doit pas être placé sur une méthode en attente (et je ne le discute pas), cela rend-il maintenant les méthodes statiques utilisant async/wait complètement redondantes?

27
Patrick McCurley

C'est mon approche de ne pas utiliser de méthodes et de classes statiques dans les opérations asynchrones - à moins qu'une technique de verrouillage ne soit implémentée pour empêcher les conditions de concurrence.

Pourquoi? À moins que vous n'utilisiez réellement shared state, il ne devrait pas y avoir de conditions de concurrence. Par exemple, considérez:

public static async Task<int> GetPageLength(string url)
{
    string text = await new WebClient().DownloadStringTaskAsync(url);
    return text.Length;
}

Si vous faites avez un état partagé - ou si vous êtes dans une méthode instance sur une instance qui est utilisée par plusieurs threads - vous devez déterminer comment vous le feriez idéalement - voulez votre opération asynchrone fonctionne. Une fois que vous avez décidé du comportement des différentes races, sa mise en œuvre peut être assez simple.

46
Jon Skeet