Ich habe eine Schnittstelle mit einigen asynchronen Funktionen.
Task
Ich glaube, die Methoden kehren zurück . async
ist 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 async
es 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 NotImplementedException
ist 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 Task
und NotImplementedException
Objekte gemeinsam nutzen kann.
Ich habe mehrere andere Beispiele vom Typ "Task-Konstante" in meiner AsyncEx-Bibliothek .