0

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

我的代码:

     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)并且不想只显示所有内容。我想显示“输入:0”-->等待计算-->显示“结果:376307504”....那么,我该怎么做呢?

感谢您的帮助。

4

2 回答 2

3

如果我理解正确,您希望从 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);                  
    });

您应该会看到结果以 10 毫秒 + 约 500 毫秒的间隔滴入。

于 2013-05-04T15:44:02.843 回答
0

您需要调用 .ObserveOnDispatcher() 以在 UI 线程上调用您的操作,而不是执行 control.Invoke/control.BeginInvoke:

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 毫秒,您会观察到不同的行为。

列表框将显示所有输入和结果。

我怀疑这是因为 10 毫秒太快了,你正在执行的所有操作都在排队。UI 线程来执行它们,然后 wham 执行所有排队的东西。

相反,每 1000 毫秒(一秒)发布一次它们允许 UI 线程执行一个、休息、执行另一个、休息等。

于 2013-05-01T18:34:02.473 回答