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 Task
e NotImplementedException
.
Ho molti altri esempi di tipo "costante di attività" nella mia libreria AsyncEx .