Prendiamo ad esempio la seguente interfaccia:Come implementare il metodo di ritorno attività sincrono senza avviso CS1998?
interface IOracle
{
Task<string> GetAnswerAsync(string question);
}
Alcune implementazioni di questa interfaccia potrebbe utilizzare async
/await
. Altri potrebbero non aver bisogno di Ad esempio, considera questa semplice implementazione del giocattolo.
class SimpleOracle
{
public Dictionary<string, string> Lookup { get; set; }
// Warning CS1998: This async method lacks 'await' operators
// and will run synchonously.
public async Task<string> GetAnswerAsync(string question)
{
string answer = Lookup[question];
return answer;
}
}
Il warning del compilatore CS1998 ha ovviamente senso. Il solito suggerimento è a remove the async
keyword and use Task.FromResult
, ma manca un sottile problema. Cosa succede se il codice genera un'eccezione? Quindi la trasformazione del codice modifica il comportamento del metodo: la versione async
avvolgerà qualsiasi eccezione in un Task
; la versione non async
non eseguirà, senza una spiegazione try
- catch
.
Lasciando che la parola chiave async
funzioni esattamente come voglio, ma genera un avviso del compilatore e non penso che la soppressione di quelli sia saggia.
Come devo rifattorizzare la mia implementazione del metodo per non produrre un avviso del compilatore e avvolgere tutte le eccezioni con Task
come farebbe qualsiasi altro metodo async
?
Controllare [questo] (http://stackoverflow.com/a/30852187/1768303) e [questo] (http : // stackove rflow.com/a/21082631/1768303) per un'altra opzione: 'Task.RunSynchronously'.Personalmente mi piace più dell'approccio 'TaskCompletionSource'. – Noseratio