我有以下代码片段:
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
功能。如果仅将aConsole.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");
}
这与您期望的完全一样。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句