15 Stimmen

Warum async und await mit Task<> verwenden?

Wenn ich eine normale Methode habe, die ich asynchron machen möchte:

public int Foo(){}

Ich würde es tun:

public Task<int> FooAsync(){
    return Task.Run(() => Foo());
}

Warum sollte ich das tun?

public async Task<int> FooAsync(){
    return await Task.Run(() => Foo());
}

Ich habe vor, dies so zu nutzen:

FooAsync().ContinueWith((res) => {});

Ich möchte, dass die Methode einfach ohne Unterbrechung ausgeführt wird, aber ich möchte, dass so etwas wie ein Rückruf ausgelöst wird, daher die ContinueWith . Aber ist es bei der zweiten Version sinnvoll, sie zu verwenden?

13voto

Max Galkin Punkte 16522

Nach meinem Verständnis brauchen Sie nur async y await wenn Sie eine Methode schreiben, die einige asynchrone Aufrufe enthält, aber Sie möchten, dass sie aussehen, als ob es nicht . Mit anderen Worten: Sie wollen Code schreiben und lesen, als wäre es normaler sequentieller Code, Ausnahmen behandeln, als wäre es normaler sequentieller Code, Werte zurückgeben, als wäre es normaler sequentieller Code und so weiter. Dann ist es die Aufgabe des Compilers, diesen Code mit allen notwendigen Rückrufen unter Beibehaltung der Logik neu zu schreiben.

Ihre Methode ist so einfach, dass ich nicht glaube, dass sie überhaupt umgeschrieben werden muss, Sie können einfach die Aufgabe zurückgeben, aber wer auch immer sie konsumiert, möchte vielleicht await für seinen Rückgabewert.

5voto

Mud Punkte 26752

Warum sollte ich das tun?

 public async Task<int> FooAsync()
 {
  return await Task.Run(() => Foo());
 }

Das würdest du nicht. Ihre vorherige Version gibt Task zurück, die bereits erwartet wird. Diese neue Version fügt nichts hinzu.

Ich habe vor, dies so zu nutzen:

  FooAsync().ContinueWith((res) => {});

Ich möchte, dass die Methode einfach ohne Unterbrechung ausgeführt wird, aber ich möchte, dass so etwas wie ein Rückruf ausgelöst wird, daher die ContinueWith.

Genau hier liegt der Unterschied. Lassen Sie uns Ihr Beispiel ein wenig näher erläutern:

void DoAsyncStuff()
{
    FooAsync().ContinueWith((res) => { DoSomethingWithInt(res.Result) });
}

Verwendung von async können Sie denselben Code wie folgt schreiben:

void async DoAsyncStuff()
{
    int res = await FooAsync();
    DoSomethingWithInt(res);
}

Das Ergebnis ist das gleiche. Die await Schlüsselwort wird der Rest Ihrer Methode zu einer Fortsetzung, die fortgesetzt wird, nachdem FooAsync einen Wert erzeugt hat. Es ist genau wie Ihr anderer Code, aber einfacher zu lesen. *Achselzucken*

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X