Ho un'interfaccia con alcune funzioni asincrone.
Metodi di ritorno Task, credo. asyncè un dettaglio di implementazione, quindi non può essere applicato ai metodi di interfaccia.
Alcune delle classi che implementano l'interfaccia non hanno nulla da attendere e alcune potrebbero semplicemente lanciare.
In questi casi, puoi trarre vantaggio dal fatto che asyncè un dettaglio di implementazione.
Se non hai nulla da fare await, puoi semplicemente tornare Task.FromResult:
public Task<int> Success() // note: no "async"
{
... // non-awaiting code
int result = ...;
return Task.FromResult(result);
}
In caso di lancio NotImplementedException, la procedura è un po 'più prolissa:
public Task<int> Fail() // note: no "async"
{
var tcs = new TaskCompletionSource<int>();
tcs.SetException(new NotImplementedException());
return tcs.Task;
}
Se hai molti metodi che lanciano NotImplementedException(che a sua volta potrebbe indicare che un po 'di refactoring a livello di progettazione sarebbe buono), allora potresti racchiudere la verbosità in una classe helper:
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;
}
La classe helper riduce anche i rifiuti che altrimenti il GC dovrebbe raccogliere, poiché ogni metodo con lo stesso tipo restituito può condividere i propri oggetti Taske NotImplementedException.
Ho molti altri esempi di tipo "costante di attività" nella mia libreria AsyncEx .