await Do-6ren">
gpt4 book ai didi

c# - 为什么 C# Rx Subscribe() 函数不适用于 "async"关键字?

转载 作者:行者123 更新时间:2023-12-05 02:08:46 24 4
gpt4 key购买 nike

我有这个代码片段:

static void Main(string[] args)
{
Observable.Range(1, 5).Subscribe(async x => await DoTheThing(x));
Console.WriteLine("done");
}

static async Task DoTheThing(int x)
{
await Task.Delay(TimeSpan.FromSeconds(x));
Console.WriteLine(x);
}

我希望它会循环 5 次,每次循环后都会打印一行

1
2
3
4
5

但令人惊讶的是,这将打印“完成”并立即终止。似乎 async+await 没有等待 Task.Delay 并退出。

语义似乎没有问题,那么我对 Subscribe 或 async 哪里做错了,如何解决它以满足我从 Rx 调用异步任务的请求?

谢谢。

最佳答案

它不是阻塞的,因为它是异步的。您的代码生成五个任务,所有任务都并行运行,并在不同时间完成。

但它们不会阻塞 Main 函数。如果您只是添加 Console.ReadKey() 作为最后一行,您会看到您的代码确实在后台运行。它打印出来。

static void Main(string[] args)
{
Observable.Range(1, 5).Subscribe(async x => await DoTheThing(x));
Console.WriteLine("done");
Console.ReadKey();
}

但是假设您想等到所有这些都完成。然后呢?

当然有.Wait(),但那是阻塞的。让我们将所有任务作为可观察对象进行观察。

我们将使用 C# 7 的 async Main

static async Task Main(string[] args)
{
await Observable.Range(1, 5)
.Select(x => DoTheThing(x).ToObservable())
.Merge();

Console.WriteLine("done");
}

这完全符合您的预期。

关于c# - 为什么 C# Rx Subscribe() 函数不适用于 "async"关键字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60577360/

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