如何使任务等待

Dav*_*inP 9 c# async-await async-ctp

昨天我开始玩Microsoft CTP异步库,无处找不到正常实现的等待任务.我知道它必须有这样的实现吗?:

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; }
}
Run Code Online (Sandbox Code Playgroud)

但是,我现在如何实现一个任务,比如等待5秒,然后返回一些字符串,例如"Hello World"?

一种方法是直接使用Task,如下所示:

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

        string str = await task;
Run Code Online (Sandbox Code Playgroud)

但是,如何通过等待实施来做到这一点?或者我只是误解了一切?

感谢您的任何信息/帮助:)

Mar*_*ell 16

这里的关键是AsyncCtpThreadingExtensions.GetAwaiter通过扩展方法提供这些方法.由于异步实现是基于模式的(如LINQ),而不是绑定到特定接口,它可以来自任何地方(TaskAwaiter在这种情况下).

您编写的代码是可以接受的.例如:

static void Main()
{
    Test();
    Console.ReadLine(); // so the exe doesn't burninate
}
static async void Test() {
    Task<string> task = TaskEx.Run(
           () =>
           {
               Thread.Sleep(5000);
               return "Hello World";
           });
    string str = await task;
    Console.WriteLine(str);
}
Run Code Online (Sandbox Code Playgroud)

Hello World5秒后打印.