gpt4 book ai didi

c# - 异步 CTP : Creating a class that is IAwaitable

转载 作者:太空宇宙 更新时间:2023-11-03 13:36:24 25 4
gpt4 key购买 nike

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

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

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

问题:在这一切中,我假设我可以通过 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;
}
}

最佳答案

更新 SP1 后,您需要:

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

不过,我建议你看看 TaskCompletionSource<T> - I looked at this, and it out-performed我天真的实现(here; obsolete)。您也可以将其用于 void任务,通过使用类似 TaskCompletionSource<bool> 的东西(并利用 Task<bool> 也是未类型化的 Task 的事实)。

关于c# - 异步 CTP : Creating a class that is IAwaitable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6731815/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com