我发现自己想要实现一个IAwaitable类(在不阻塞线程的情况下实现异步调用的东西)。
我安装了最新版本的AsyncCTP,编译器说我需要一个IsCompleted()成员。好的,所以CTP预览已经移动了一点(我明白了,就像预览一样)
问题:AsyncCTP语言扩展程序期望现在的接口是什么?
问题:在这一切中,我假设我可以通过lamda / delegate向“IAwaitable”发出信号?这可能吗?我们称之为EndAwait吗? intellisense建议你调用EndAwait来检索结果......这听起来不对。有什么想法吗?
到目前为止,我发现的所有示例都是针对AsyncCTP库已经实现的功能,例如:
await new WebClient().DownloadStringTaskAsync(uri).ConfigureAwait(false);
来自101 AsyncSamplesCS 的
背景
我发现自己在Jon Skeets页面上(再次)看着this example
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;
}
}
答案 0 :(得分:4)
使用SP1刷新,您需要:
GetAwaiter()
方法(可能但不一定是扩展方法)返回一些内容(在您的示例中为Awaiter
)以及所有:
bool IsCompleted
属性(get
)void OnCompleted(Action callback)
GetResult()
的{{1}}方法,或等待操作的预期结果但是,我建议您查看TaskCompletionSource<T>
- I looked at this, and it out-performed我的天真实施(here; obsolete)。您还可以使用void
这样的任务来使用void
,并利用TaskCompletionSource<bool>
也是无类型Task<bool>
这一事实。