3

我发现自己想要实现一个 IAwaitable 类(实现异步调用而不阻塞线程的东西)。

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

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

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

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

  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;
    }
}
4

1 回答 1

5

使用 SP1 刷新,您需要:

  • 一些GetAwaiter()方法(可能但不一定是扩展方法)返回一些东西(Awaiter在你的例子中),包括:
    • 一个bool IsCompleted属性 ( get)
    • 一种void OnCompleted(Action callback)
    • GetResult()返回的方法void,或等待操作的期望结果

但是,我建议您看一下TaskCompletionSource<T>-我看过这个,它的性能优于我的幼稚实现(here; obsolete)。您还可以void通过使用 a 之类的东西将它用于任务(并利用 the也是 untypedTaskCompletionSource<bool>的事实)。Task<bool>Task

于 2011-07-18T11:16:13.967 回答