AsyncCTP:创建一个IAwaitable类

时间:2011-07-18 10:53:17

标签: c# android asynchronous android-asynctask async-await

我发现自己想要实现一个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;
    }
}

1 个答案:

答案 0 :(得分:4)

使用SP1刷新,您需要:

  • 一些GetAwaiter()方法(可能但不一定是扩展方法)返回一些内容(在您的示例中为Awaiter)以及所有:
    • bool IsCompleted属性(get
    • A void OnCompleted(Action callback)
    • 返回GetResult()的{​​{1}}方法,或等待操作的预期结果

但是,我建议您查看TaskCompletionSource<T> - I looked at this, and it out-performed我的天真实施(here; obsolete)。您还可以使用void这样的任务来使用void,并利用TaskCompletionSource<bool>也是无类型Task<bool>这一事实。