【问题标题】:AsyncCTP: Creating a class that is IAwaitableAsyncCTP:创建一个 IAwaitable 的类
【发布时间】:2011-10-07 14:11:04
【问题描述】:

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

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

问题:AsyncCTP 语言扩展现在需要什么接口

问题:在这一切中,我假设我可以通过 lamda/delegate 向“IAwaitable”发出信号?这可能吗?我们调用 EndAwait 吗?智能感知建议您调用 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;
    }
}

【问题讨论】:

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


    【解决方案1】:

    使用 SP1 刷新,您需要:

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

    但是,我建议你看看 TaskCompletionSource<T> - I looked at this, and it out-performed 我的幼稚实现 (here; obsolete)。你也可以将它用于void 任务,通过使用TaskCompletionSource<bool> 之类的东西(并利用Task<bool> 也是无类型Task 的事实)。

    【讨论】:

    • +1 我来看看。最初,我对您过时的链接有类似的动机。希望有了 TaskCompletionSource,我将回到更安全、更少实验性的状态。
    • 我让 TaskCompletionSource 工作得比我想象的要干净得多。非常感谢您为我指明这个方向!
    猜你喜欢
    • 2011-09-11
    • 1970-01-01
    • 1970-01-01
    • 2012-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-07
    相关资源
    最近更新 更多