c# - heft - Erstellen Sie eine abgeschlossene Aufgabe



abitur 2019 hamburg termine (6)

Ich möchte eine abgeschlossene Task erstellen (nicht Task<T> ). Ist dafür etwas in .NET integriert?

Eine verwandte Frage: Erstellen Sie eine abgeschlossene Aufgabe <T>

https://src-bin.com


Answer #1

Die neueste Version von .Net (v4.6) fügt genau das hinzu, eine eingebaute Task.CompletedTask :

Task completedTask = Task.CompletedTask;

Diese Eigenschaft wird als Singleton ohne Sperre implementiert, sodass Sie fast immer dieselbe abgeschlossene Aufgabe verwenden.


Answer #2

Für .Net 4.6 und höher

return Task.CompletedTask;

Für niedrigere Version können Sie verwenden

return new Task(() => { });

Answer #3

Meine bevorzugte Methode dafür ist, Task.WhenAll() ohne Argumente Task.WhenAll() . Die MSDN-Dokumentation gibt Folgendes an: "Wenn das angegebene Array / Enumerable keine Tasks enthält, wird die zurückgegebene Task sofort in einen RanToCompletion-Status übergehen, bevor sie an den Aufrufer zurückgegeben wird." Das klingt wie du willst.

Update: Ich habe die Quelle in der Referenzquelle von Microsoft gefunden . Dort können Sie sehen, dass Task.WhenAll Folgendes enthält:

return (tasks.Length == 0) ? // take shortcut if there are no tasks upon which to wait
            Task.CompletedTask :
            new WhenAllPromise(tasks);

Daher ist Task.CompletedTask zwar intern, wird jedoch durch den Aufruf von WhenAll () ohne Argumente angezeigt.


Answer #4

Sie können Task.FromResult (in .NET 4.5) verwenden, um eine abgeschlossene Task<T> .

Wenn Sie eine nicht generische Task benötigen, können Sie immer Task.FromResult(0) oder ähnliches verwenden, da Task<T> eine Unterklasse von Task .


Answer #5

Wie wäre es mit:

#pragma warning disable 1998
    public async Task emptyTask() {
    }
#pragma warning restore 1998

Sie können die Warnunterdrückung weglassen, wenn es Ihnen nichts ausmacht.


Answer #6

Task<T> implizit in Task konvertiert werden, also rufen Sie einfach eine abgeschlossene Task<T> (mit beliebigem T und einem beliebigen Wert) ab und verwenden Sie diese. Sie können so etwas verwenden, um die Tatsache zu verbergen, dass irgendwo ein tatsächliches Ergebnis vorhanden ist.

private static Task completedTask = Task.FromResult(false);
public static Task CompletedTask()
{
    return completedTask;
}

Beachten Sie, dass wir, da wir das Ergebnis nicht offenlegen und die Aufgabe immer abgeschlossen ist, eine einzelne Aufgabe zwischenspeichern und wiederverwenden können.

Wenn Sie .NET 4.0 verwenden und FromResult nicht FromResult , können Sie mithilfe von TaskCompletionSource eine eigene TaskCompletionSource :

public static Task<T> FromResult<T>(T value)
{
    var tcs = new TaskCompletionSource<T>();
    tcs.SetResult(value);
    return tcs.Task;
}




task-parallel-library