Comment faire Tâche awaitable

Hier, j'ai commencé à jouer avec Microsoft async CTP de la bibliothèque, et nulle part je ne pouvais pas trouver la bonne mise en œuvre de la awaitable Tâche. Je sais qu'il doit y avoir la mise en œuvre de ce genre?:

public struct SampleAwaiter<T>
{
    private readonly Task<T> task;
    public SampleAwaiter(Task<T> task) { this.task = task; }
    public bool IsCompleted { get { return task.IsCompleted; } }
    public void OnCompleted(Action continuation) { TaskEx.Run(continuation); }
    public T GetResult() { return task.Result; }
}

Mais comment pourrais-je maintenant de mettre en œuvre une tâche qui, disons-le, attendez 5 secondes, et le retourner une chaîne de caractères, par exemple "Hello World"?

Une façon est d'utiliser des Tâches directement comme ceci:

Task<string> task = TaskEx.Run(
            () =>
                {
                    Thread.Sleep(5000);
                    return "Hello World";
                });

        string str = await task;

Mais comment pourrais-je le faire avec le awaitable mise en œuvre? Ou ai-je mal compris tout?

Merci pour toute information/aide 🙂

async/await s'applique aux méthodes, pas de Tâches.
await s'applique à des expressions qui ont un adapté GetAwaiter() mise en œuvre, qui Task ne - so await s'applique à Task (dans un sens)
Dans ce cas étroite, vous pouvez le faire await TaskEx.Delay(5000);, mais vous aurez à étudier de plus, pour votre cas général. Le await mot clé de recherche GetAwaiter, et plus généralement tout ce qui est apte à GetAwaiter peut être utilisé avec les attendent. Jon Skeet a une grande série dans son blog disecting vous attendent dans le plus grand détail.
attendre ne s'applique pas aux méthodes. Il s'applique à toute expression qui s'évalue à la Tâche ou à la Tâche(T). C'est une erreur commune.

OriginalL'auteur DavorinP | 2011-08-07