gpt4 book ai didi

c# - 如何使任务可等待

转载 作者:太空狗 更新时间:2023-10-29 17:36:07 24 4
gpt4 key购买 nike

昨天我开始使用 Microsoft CTP 异步库,但我找不到任何地方都找不到可等待任务的正确实现。我知道它必须有这样的实现?:

public struct SampleAwaiter<T>
{
private readonly Task<T> task;
public SampleAwaiter(Task<T> task) { this.task = task; }
public bool IsCompleted { get { return task.IsCompleted; } }
public void OnCompleted(Action continuation) { TaskEx.Run(continuation); }
public T GetResult() { return task.Result; }
}

但是我现在如何实现一个任务,比方说,等待 5 秒,然后返回一些字符串,例如“Hello World”?

一种方法是像这样直接使用任务:

Task<string> task = TaskEx.Run(
() =>
{
Thread.Sleep(5000);
return "Hello World";
});

string str = await task;

但是我将如何使用可等待的实现来做到这一点?还是我误解了一切?

感谢任何信息/帮助:)

最佳答案

这里的关键是 AsyncCtpThreadingExtensions.GetAwaiter,它通过扩展方法提供这些方法。由于异步实现是基于模式(如 LINQ),而不是绑定(bind)到特定接口(interface),它可以来自任何地方(在本例中是 TaskAwaiter)。

您编写的代码是可等待的。例如:

static void Main()
{
Test();
Console.ReadLine(); // so the exe doesn't burninate
}
static async void Test() {
Task<string> task = TaskEx.Run(
() =>
{
Thread.Sleep(5000);
return "Hello World";
});
string str = await task;
Console.WriteLine(str);
}

这将在 5 秒后打印 Hello World

关于c# - 如何使任务可等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6971688/

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