我想做一个小项目做一些计算,并在列表框中添加计算结果。
我代码: int SumLoop(int lowLimit, int highLimit)
{
int idx;
int totalSum = 0;
for (idx = lowLimit; idx <= highLimit; idx = idx + 1)
{
totalSum += idx;
}
return totalSum;
}
private void button1_Click(object sender, EventArgs e)
{
var test2 = Observable.Interval(TimeSpan.FromMilliseconds(1000)).Select(x=>(int)x).Take(10);
test2.Subscribe(n =>
{
this.BeginInvoke(new Action(() =>
{
listBox1.Items.Add("input:" + n);
listBox1.Items.Add("result:" + SumLoop(n,99900000));
}));
});
}
结果:input:0
result:376307504
(stop a while)
input:1
result:376307504
(stop a while)
input:2
result:376307503
(stop a while)
input:3
result:376307501
(stop a while)
....
...
..
.
input:"9
result:376307468
如果我想修改从1000到> 10的间隔常数,
var test2 = Observable.Interval(TimeSpan.FromMilliseconds(10)).Select(x=>(int)x).Take(10);
显示行为发生变化。列表框将显示所有输入和结果。似乎它等待所有的结果完成,然后显示所有的列表框。为什么?
如果我想继续使用这个常数(间隔:10),不想显示一切只是一个镜头。我想显示"Input:0"——>等待计算——>显示"result:376307504"....那么,我该怎么做呢?
谢谢你的帮助。
如果我理解正确的话,你想要在UI线程中运行sum循环,下面是你应该怎么做的:
Observable
.Interval(TimeSpan.FromMilliseconds(1000))
.Select(x => (int)x)
.Select(x => SumLoop(x, 99900000))
.Take(10)
.ObserveOn(listBox1) // or ObserveOnDispatcher() if you're using WPF
.Subscribe(r => {
listBox1.Items.Add("result:" + r);
});
您应该会看到结果以10ms + ~500ms的间隔缓慢进入。
代替control. invoke/control。BeginInvoke,你需要调用。observeondispatcher()来在UI线程上调用你的操作:
Observable
.Interval(TimeSpan.FromMilliseconds(1000))
.Select(x=>(int)x)
.Take(10)
.Subscribe(x => {
listBox1.Items.Add("input:" + x);
listBox1.Items.Add("result:" + SumLoop(x, 99900000));
});
您说如果您将间隔从1000毫秒更改为10毫秒,您将观察到不同的行为。
列表框将显示所有输入和结果。
我怀疑这是因为10ms太快了,你正在执行的所有动作都是排队的。UI线程来执行它们,然后砰的一声,执行所有排队的东西。
相反,每1000毫秒(1秒)发布一次,UI线程可以执行一个,休息,执行另一个,休息,等等。