为什么 C# Rx Subscribe() 函数不适用于 "async" 关键字?
Why C# Rx Subscribe() function doesn't work with "async" keyword?
我有这个代码片段:
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
但令人惊讶的是,这将打印 "done" 并立即终止。似乎 async+await 没有等待 Task.Delay 并退出。
语义似乎没有问题,那么我在订阅或异步方面哪里错了,如何解决它以满足我从 Rx 调用异步任务的请求?
谢谢。
它不是阻塞的,因为它是异步的。
您的代码生成五个任务,全部 运行ning 并行,在不同时间完成。
但它们不会阻止 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");
}
这完全符合您的预期。
我有这个代码片段:
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
但令人惊讶的是,这将打印 "done" 并立即终止。似乎 async+await 没有等待 Task.Delay 并退出。
语义似乎没有问题,那么我在订阅或异步方面哪里错了,如何解决它以满足我从 Rx 调用异步任务的请求?
谢谢。
它不是阻塞的,因为它是异步的。 您的代码生成五个任务,全部 运行ning 并行,在不同时间完成。
但它们不会阻止 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");
}
这完全符合您的预期。