Asynchronisme - WinRT - Passer d’un pattern asynchrone avec callback à async/await

1 minute read

Lorsque l’on développe sous WinRT en C# on utilise assez vite async/await. Mais comment faire dans le cas où l’on développe une application multiplateforme dont une des plateformes ne dispose pas de ce pattern par exemple Windows Phone 7 ?

Dans le cas de mon application, j’utilise un pattern assez simple où chaque repository dispose d’une méthode Load qui est asynchrone. La fin du chargement étant notifié grâce à une callback passée en paramètre qui contient soit le résultat de l’action, soit l’exception lancée en cas d’erreur. Si vous avez lu mes précédents articles vous saurez que mon utilisation de ce pattern n’est pas récente. Voici ce que celà donne en vrai :

public void Load(Action<GameStatistics, Exception> callback)
{
   ...
}

Rendre celà compatible avec async/await n’est pas très compliqué et toute la magie réside dans la classe TaskCompletionSource.

Voici comment envelopper l’appel précédent :

public async Task<GameStatistics> LoadAsync()
{
    TaskCompletionSource<GameStatistics> source = new TaskCompletionSource<GameStatistics>();

    this.Load((result, error) =>
    {
        if (error != null)
            source.SetException(error);
        else
            source.SetResult(result);

    });

    return await source.Task;
}

Grâce à cette petite astuce on peux creer toute une série de wrapper autour des méthodes que l’on souhaite utiliser avec async/await et déclarée avec d’autres pattern asynchrones.

Updated:

Leave a Comment