web-dev-qa-db-fra.com

Cette méthode asynchrone manque d'opérateurs "en attente" et s'exécutera de manière synchrone

mon programme a 3 avertissements de la déclaration suivante:

Cette méthode asynchrone manque d'opérateur "wait" et s'exécutera de manière synchrone. Songez à utiliser l'opérateur "wait" pour attendre les appels d'API non bloquants, Ou "wait Task.Run (...)" faire un travail lié au CPU sur un thread d'arrière-plan.

Quel est l'avertissement essayez de me dire? Que devrais-je faire? 

Ceci est mon code: Est-ce qu'il fonctionne en multi-threading?

static void Main(string[] args)
{
    Task task1 = new Task(Work1);
    Task task2 = new Task(Work2);
    Task task3 = new Task(Work3);

    task1.Start();
    task2.Start();
    task3.Start();

    Console.ReadKey();
}

static async void Work1()
{
    Console.WriteLine("10 started");
    Thread.Sleep(10000);
    Console.WriteLine("10 completed");
}

static async void Work2()
{
    Console.WriteLine("3 started");
    Thread.Sleep(3000);
    Console.WriteLine("3 completed");
}

static async void Work3()
{
    Console.WriteLine("5 started");
    Thread.Sleep(5000);
    Console.WriteLine("5 completed");
}
4
mjb

Le mot clé asyncname__, en soi, ne fait pas grand chose. Supprimez-le de votre code et votre code agira exactement de la même manière.

Que fait asyncname__?

  • Cela change ce qui est valable à l'intérieur de la méthode, en particulier cela vous permet d'utiliser le mot clé awaitname__
  • À son tour, cela signifie que le corps de la méthode sera transformé, en fonction des awaitname__s présents dans le corps de la méthode.
  • Et si la méthode retourne une valeur, elle est également transformée pour envelopper la valeur de retour dans un Taskname__.

Toutefois, si a) vous n'avez aucun awaitname__s dans le corps de votre méthode et b) si voidest renvoyé, rien de spécial ne sera obtenu. L’avertissement du compilateur tente d’être clair à ce sujet - une méthode asyncsans awaitname__s n’a tout simplement pas de sens. awaitname__s est la partie la plus importante de cette fonctionnalité.

4

Oui, votre code utilisera probablement le multi-threading. Cependant, il le ferait toujours si vous veniez de supprimer le mot clé async. Comme vous n'avez pas expliqué pourquoi c'est là, je suggère de l'enlever. 

Si vous voulez un motif async/wait, vous pouvez utiliser Task.Delay() mais je vous conseillerais d'en lire plus sur async/wait avant de l'utiliser:

static async void Work3()
{
    Console.WriteLine("5 started");
    await Task.Delay(5000);
    Console.WriteLine("5 completed");
}
1
nvoigt

Vous avez utilisé le mot clé 'async' avec la méthode qui indique que les méthodes Work1 (), Work2 () et Work3 () sont exécutées de manière asynchrone, mais vous n'avez pas utilisé le mot clé 'waiting'. Pour l'exécuter de manière synchrone. Utilisez le mot clé 'await' vous voulez l'exécuter de manière asynchrone.

 static async void Work1()
 {
     Console.WriteLine("10 started");
    await Task.Delay(10000);
     Console.WriteLine("10 completed");
 }

 static async void Work2()
 {
     Console.WriteLine("3 started");
     await Task.Delay(3000);
     Console.WriteLine("3 completed");
 }

 static async void Work3()
 {
     Console.WriteLine("5 started");
     await Task.Delay(5000);
     Console.WriteLine("5 completed");
 }
1
jignesh

Vous avez désigné vos méthodes (Work1, Work2, Work3) par le mot clé async, mais aucun de vos codes dans ces méthodes n'utilise l'opérateur await pour appeler des appels asynchrones.

0
Hawkmooon