【发布时间】:2013-12-22 15:55:25
【问题描述】:
我正在尝试使用Observable.FromAsync 将一些 TPL 异步集成到更大的 Rx 链中,就像在这个小例子中一样:
using System;
using System.Reactive.Linq;
using System.Threading.Tasks;
namespace rxtest
{
class Program
{
static void Main(string[] args)
{
MainAsync().Wait();
}
static async Task MainAsync()
{
await Observable.Generate(new Random(), x => true,
x => x, x => x.Next(250, 500))
.SelectMany((x, idx) => Observable.FromAsync(async ct =>
{
Console.WriteLine("start: " + idx.ToString());
await Task.Delay(x, ct);
Console.WriteLine("finish: " + idx.ToString());
return idx;
}))
.Take(10)
.LastOrDefaultAsync();
}
}
}
但是,我注意到这似乎会同时启动所有异步任务,而不是一次执行一个,这会导致应用程序的内存使用量激增。 SelectMany 的行为似乎与 Merge 没有什么不同。
在这里,我看到这样的输出:
start: 0
start: 1
start: 2
...
我想看看:
start: 0
finish: 0
start: 1
finish: 1
start: 2
finish: 2
...
我怎样才能做到这一点?
【问题讨论】:
-
所以你想用并行库编写串行代码?
-
@AustinSalonen 这些工具旨在处理异步代码,而不仅仅是并行代码。并非所有异步代码都需要并行化。他在这里使用了完全合适的工具。
-
@Servy:我真的只是想看看这里到底发生了什么。您可以简单地阻止
FromAsync调用来满足这种情况。这可能不是正确,但看起来这就是他想要的。 -
@AustinSalonen 这不会保持异步,并且不恰当地使用这些工具。鉴于 OP 正在使用这些工具,显然他们希望找到一个异步解决方案来解决这个问题。为这个问题找到一个完全同步的解决方案非常简单。
-
@AustinSalonen 如果您认为某个问题不够清楚,要求澄清比假设对方不知道自己在做什么而留下尖刻评论更有效。
标签: c# .net task-parallel-library system.reactive