Warning : This page has been marked as an archive because the author consider that its content is no longer relevant.

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 ?

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.

Comments