为什么C#Rx Subscribe()函数不';“我不能和”一起工作;异步;关键词?

为什么C#Rx Subscribe()函数不';“我不能和”一起工作;异步;关键词?,c#,asynchronous,async-await,system.reactive,subscribe,C#,Asynchronous,Async Await,System.reactive,Subscribe,我得到了以下代码片段: 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.

我得到了以下代码片段:

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+wait似乎没有等待任务。延迟并退出

语义似乎并没有问题,所以我在订阅或异步方面哪里出错了,如何修复它以满足我从Rx调用异步任务的请求


谢谢。

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

但它们不会阻止
主功能。
如果您只添加一个
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");
}

这和你期望的完全一样

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

但它们不会阻止
主功能。
如果您只添加一个
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");
}

这和你期望的完全一样

您是否希望在5秒或15秒的过程中打印1到5?您是否希望在5秒或15秒的过程中打印1到5?