昨天我开始玩微软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; } }
但是我现在如何实现一个任务,让我们等待5秒钟,并返回一些字符串,例如“Hello World”?
一种方法是直接使用任务:
Task<string> task = TaskEx.Run( () => { Thread.Sleep(5000); return "Hello World"; }); string str = await task;
但是,如何等待实施呢?还是我只是误解了一切?
感谢任何信息/帮助:)
解决方法
这里的关键是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); }
5秒后打印Hello World.