webentwicklung-frage-antwort-db.com.de

Diese asynchrone Methode hat keine 'wait'-Operatoren und wird synchron ausgeführt

mein Programm enthält 3 Warnungen vor der folgenden Anweisung:

Diese async-Methode hat keine 'Erwarte'-Operatoren und wird synchron ausgeführt. Erwägen Sie die Verwendung des' Erwarten'-Operators, um auf nicht blockierende API-Aufrufe zu warten, Oder 'Erwarte Task.Run (...)'. CPU-gebundene Arbeit an einem Hintergrund-Thread.

Was ist die Warnung versuchen Sie mir zu sagen? Was soll ich machen? 

Dies ist mein Code: Läuft er mit Multithreading?

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

Das async-Schlüsselwort alleine macht nicht viel. Wenn Sie es aus Ihrem Code entfernen, verhält sich Ihr Code genauso.

Was macht async?

  • Dadurch wird das Gültige innerhalb der Methode geändert, insbesondere können Sie das Schlüsselwort await verwenden
  • Dies bedeutet wiederum, dass der Rumpf der Methode basierend auf den awaits, die im Rumpf der Methode vorhanden sind, transformiert wird.
  • Wenn die Methode einen Wert zurückgibt, wird die Methode auch so umgewandelt, dass der Rückgabewert in eine Task eingeschlossen wird.

Wenn Sie jedoch a) keine awaits in Ihrem Methodenkörper haben und b) void zurückkehren, wird nichts Besonderes erreicht. Die Compiler-Warnung versucht dies klar zu machen - eine async-Methode ohne awaits macht einfach keinen Sinn. awaits sind der wichtigere Teil dieser Funktion.

Ja, Ihr Code wird wahrscheinlich Multi-Threading verwenden. Dies würde jedoch immer noch der Fall sein, wenn Sie das Schlüsselwort async entfernt haben. Da Sie nicht erklärt haben, warum es dort ist, schlage ich vor, es zu entfernen. 

Wenn Sie ein async/await-Muster wünschen, können Sie Task.Delay() verwenden. Ich würde jedoch empfehlen, vor der Verwendung mehr über async/await zu lesen:

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

Sie haben das Schlüsselwort 'async' mit der Methode verwendet, die angibt, dass die Methoden Work1 (), Work2 () und Work3 () asynchron ausgeführt werden, das Schlüsselwort 'await' jedoch nicht verwendet wurde. So wird es als synchron ausgeführt. Verwenden Sie das Schlüsselwort 'await' if Sie möchten es asynchron ausführen.

 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

Sie haben Ihre Methoden (Work1, Work2, Work3) mit dem Schlüsselwort async angegeben, aber Ihr Code innerhalb dieser Methoden verwendet den Operator await zum Aufrufen asynchroner Aufrufe.

0
Hawkmooon