Ich habe eine Schnittstelle mit einigen asynchronen Funktionen.
TaskIch glaube, die Methoden kehren zurück . asyncist ein Implementierungsdetail und kann daher nicht auf Schnittstellenmethoden angewendet werden.
Einige der Klassen, die die Schnittstelle implementieren, müssen nicht warten, andere werfen möglicherweise nur.
In diesen Fällen können Sie die Tatsache nutzen, dass asynces sich um ein Implementierungsdetail handelt.
Wenn Sie nichts zu tun haben await, können Sie einfach zurückkehren Task.FromResult:
public Task<int> Success() // note: no "async"
{
... // non-awaiting code
int result = ...;
return Task.FromResult(result);
}
Beim Werfen NotImplementedExceptionist das Verfahren etwas wortreicher:
public Task<int> Fail() // note: no "async"
{
var tcs = new TaskCompletionSource<int>();
tcs.SetException(new NotImplementedException());
return tcs.Task;
}
Wenn Sie viele Methoden zum Werfen haben NotImplementedException(was selbst darauf hindeuten könnte, dass ein Refactoring auf Designebene gut wäre), können Sie die Worthaftigkeit in eine Hilfsklasse einschließen:
public static class TaskConstants<TResult>
{
static TaskConstants()
{
var tcs = new TaskCompletionSource<TResult>();
tcs.SetException(new NotImplementedException());
NotImplemented = tcs.Task;
}
public static Task<TResult> NotImplemented { get; private set; }
}
public Task<int> Fail() // note: no "async"
{
return TaskConstants<int>.NotImplemented;
}
Die Hilfsklasse reduziert auch den Müll, den der GC sonst sammeln müsste, da jede Methode mit demselben Rückgabetyp ihre Taskund NotImplementedExceptionObjekte gemeinsam nutzen kann.
Ich habe mehrere andere Beispiele vom Typ "Task-Konstante" in meiner AsyncEx-Bibliothek .