2016-06-30 7 views
-1

Zum Beispiel, was ist der Unterschied zwischen diesem Code:Was ist der Unterschied zwischen Asynchron-Task-und Task-

public async Task DoSomething(int aqq) 
{ 
    await DoAnotherThingAsync(aqq); 
} 

und diese:

public Task DoSomething(int aqq) 
{ 
    DoAnotherThingAsync(aqq); 
} 

sie sind beide richtig?

+0

ich dies als Duplikat markiert. Die andere Frage ist nicht genau die gleiche wie deine, aber die Antwort gilt genauso gut. – Luaan

Antwort

0

Beide Signaturen sind richtig, wenn sie richtig verwendet werden.

async Task können Sie erwarten Schlüsselwort innerhalb Ihrer Methode verwenden. Das erste Beispiel ist völlig in Ordnung.

Das zweite Beispiel fehlende return-Anweisung:

public Task DoSomething(int aqq) 
{ 
    return DoAnotherThingAsync(aqq); 
} 

mit der zweiten Unterschrift gehen kann man nicht erwarten Schlüsselwort verwenden, aber trotzdem kann man eine bestimmte Aufgabe zurückkehren, dass Sie von somwhere bekam sonst zum Beispiel Task.FromResult(true);

Um Ihnen einen weiteren Unterschied betrachten Sie das Beispiel:

public async Task DoSomething1(int aqq) 
{ 
    await DoAnotherThingAsync(aqq); //blocks here and wait DoAnotherThingAsync to respond 
    SomethingElse(); 
} 


public Task DoSomething2(int aqq) 
{ 
    var task = DoAnotherThingAsync(aqq); //keep going here, not waiting for anything 
    SomethingElse(); 
    return task; 
} 

public async Task DoAnotherThingAsync(int aqq) 
{ 
    await Task.Delay(100); 
} 

public void SomethingElse() 
{ 
    //do something 
} 

Wenn Sie async verwenden/erwarten Sie warten tatsächlich die tas k zu vervollständigen. Das Zurückgeben einer Aufgabe wartet nicht auf die Ausführung der Aufgabe.

0

In Ihrer Stichprobe, nein. Ihre zweite Methode bricht die Task-Kette, was völlig falsch ist und dazu führen kann, dass Fehler und seltsames Verhalten insgesamt schwer zu finden sind.

Sie müssen zurückgeben die Aufgabe, wenn Sie nicht async (die die Rückgabe für Sie automatisch behandelt behandelt).

Es gibt auch einige subtile Unterschiede, die beim Debuggen und einigen anderen Problemen wichtig sind, aber das ist ein ziemlich weites Thema :) Bis Sie das Problem perfekt verstehen, verwenden Sie einfach async und erwarten Sie - sie sind das höchste verfügbare Werkzeug in C# An diesem Punkt.

-2

Ja, beide korrigieren, aber zweitens ist besser.

Async-Schlüsselwort ist nur ein Syntax-Zucker, der es uns ermöglicht, linearen Code anstelle von merkwürdiger Art von manuellen Aufgaben zu schreiben.

Erste Variante ist in Zustandsmaschine kompiliert und es ergibt sich, dass es ein wenig mehr Zeit als zweite Variante dauert. Sie können sogar die erste Variante in return Task.Run(() => DoAnotherThingAsync(aqq).Result) umschreiben, um eine Idee zu bekommen, wo der Unterschied ist. Hinweis: Dies ist nur eine Idee, stattdessen ist das Umschreiben der ersten Methode komplexer. Ich möchte dir nur zeigen, dass deine Varianten nicht ähnlich sind.

Sie können mehr darüber lesen, wie asynchrones Arbeiten im Artikel "Async Await and the Generated StateMachine"

+0

Sie haben Recht, dass der erste Fall in eine Zustandsmaschine umgeschrieben wird und dass er Kosten verursacht (natürlich, wenn Sie mit echtem I/O-Code zu tun haben, sind diese Kosten höchstwahrscheinlich winzig im Vergleich zu Ihrer Arbeit.) versuche es, aber okay). Es gibt jedoch keine Ähnlichkeit zwischen der Verwendung von "Task.Run" und "erwarten", das ist nur völlig irreführend. Klären Sie entweder, was Sie sagen wollen, oder beseitigen Sie den Anspruch. – Luaan

+0

@Luaan ja, du hast Recht. Klarstellung hinzugefügt, um Irreführung zu vermeiden. –