【发布时间】:2015-03-12 22:21:05
【问题描述】:
给定一个这样的主题:
var input = new Subject<int>();
和这样的订阅者:
var observer1 = input
.Subscribe(ev =>
{
Thread.Sleep(1000);
listBox.Items.Add("o1: " + ev.ToString());
});
var observer2 = input
.Subscribe(ev =>
{
Thread.Sleep(1000);
listBox.Items.Add("o2: " + ev.ToString());
});
我怎样才能调整它,以便当我这样做时
Enumerable.Range(0, 1000).ToList().ForEach((i) =>
{
input.OnNext(i);
});
OnNext 被称为异步,但订阅与 UI 线程同步。 (这是一个 WinForms 环境)
我试过了
var observer1 = input
.ObserveOn(TaskPoolScheduler.Default)
.Subscribe(ev =>
{
Thread.Sleep(1000);
listBox.Items.Add("o1: " + ev.ToString());
});
我可以看到observe1 和observer2 立即开始他们的订阅操作而无需等待,因为ObserveOn。但是现在应用程序由于在非 ui 线程上调用列表框而崩溃。一旦我将订阅的动作与 UI 同步,我就失去了 OnNext 调用的并行处理。
知道如何解决吗?
【问题讨论】:
-
你知道 Rx 会阻止
.OnNext()的并行执行吗?
标签: c# .net winforms system.reactive reactive-programming