AsyncCTP:创建一个IAwaitable类

我发现自己想要实现一个IAwaitable类(在不阻塞线程的情况下实现异步调用)。

我安装了最新版本的AsyncCTP,编译器说我需要一个IsCompleted()成员。 好的,所以CTP预览已经移动了一点(我明白了,就像预览一样)

问题:AsyncCTP语言扩展现在期待什么接口?

问题:在这一切中,我假设我可以通过lamda / delegate向“IAwaitable”发出信号? 这可能吗? 我们称之为EndAwait吗? intellisense建议你调用EndAwait来检索结果……这听起来不对。 有任何想法吗?

到目前为止,我发现的所有示例都是针对AsyncCTP库已经实现的function,例如:

await new WebClient().DownloadStringTaskAsync(uri).ConfigureAwait(false); 

来自101 AsyncSamplesCS

背景:

我发现自己在Jon Skeets页面上(再次)看着这个例子

 using System; class Test { static async void Main() { await new Awaitable(); } } class Awaitable { public Awaiter GetAwaiter() { return new Awaiter(); } } class Awaiter { public bool BeginAwait(Action continuation) { return false; } public int EndAwait() { return 1; } } 

使用SP1刷新,您需要:

  • 一些GetAwaiter()方法(可能但不一定是扩展方法)返回一些内容(在您的示例中为Awaiter ),其中包含以下所有内容:
    • 一个bool IsCompleted属性( get
    • void OnCompleted(Action callback)
    • 一个GetResult()方法,它返回void或等待操作的期望结果

但是,我建议你看看TaskCompletionSource – 我看了这个,它超出了我的天真实现( 这里;已经过时 )。 您还可以通过使用TaskCompletionSource类的东西将其用于void任务(并利用Task也是无类型Task的事实)。