Rx订阅问题,如何在winform中更新UI控件中的数据



我想做一个小项目做一些计算,并在列表框中添加计算结果。

我代码:

     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);
  1. 显示行为发生变化。列表框将显示所有输入和结果。似乎它等待所有的结果完成,然后显示所有的列表框。为什么?

  2. 如果我想继续使用这个常数(间隔: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线程可以执行一个,休息,执行另一个,休息,等等。

相关内容

  • 没有找到相关文章