J'essaie actuellement de créer mon application en utilisant certaines méthodes Async. Toutes mes E / S sont effectuées via des implémentations explicites d'une interface et je suis un peu confus sur la façon de rendre les opérations asynchrones.
Comme je vois les choses, j'ai deux options dans la mise en œuvre:
interface IIO
{
void DoOperation();
}
OPTION1: Effectuez une implémentation implicite asynchrone et attendez le résultat dans l'implémentation implicite.
class IOImplementation : IIO
{
async void DoOperation()
{
await Task.Factory.StartNew(() =>
{
//WRITING A FILE OR SOME SUCH THINGAMAGIG
});
}
#region IIO Members
void IIO.DoOperation()
{
DoOperation();
}
#endregion
}
OPTION2: Effectuez une implémentation explicite asynchrone et attendez la tâche de l'implémentation implicite.
class IOAsyncImplementation : IIO
{
private Task DoOperationAsync()
{
return new Task(() =>
{
//DO ALL THE HEAVY LIFTING!!!
});
}
#region IIOAsync Members
async void IIO.DoOperation()
{
await DoOperationAsync();
}
#endregion
}
L'une de ces implémentations est-elle meilleure que l'autre ou y a-t-il une autre façon de procéder à laquelle je ne pense pas?
la source
async
):async Task IIO.DoOperationAsync()
. Et voulez-vous dire où êtes-vousawait
le retourTask
? Où que vous appeliezDoOperationAsync()
.Task.Run()
, ce code IO devrait être lui-même asynchrone et vous le feriezawait
directement. Par exempleline = await streamReader.ReadLineAsync()
.La meilleure solution consiste à introduire une autre interface pour les opérations asynchrones. La nouvelle interface doit hériter de l'interface d'origine.
Exemple:
PS Reconcevez vos opérations asynchrones pour qu'elles renvoient Task au lieu de void, sauf si vous devez vraiment retourner void.
la source
GetAwaiter().GetResult()
au lieu deWait()
? De cette façon, vous n'avez pas besoin de décompresser unAggregateException
pour récupérer l'exception interne.class Impl : IIO, IIOAsync
. Cependant, IIO et IIOAsync eux-mêmes sont des contrats différents qui peuvent éviter de faire entrer les «anciens contrats» dans un code plus récent.var c = new Impl(); IIOAsync asAsync = c; IIO asSync = c
.