DoWork方法如何在C#中用于异步通信(ELI5)

时间:2016-06-21 17:32:54

标签: c# multithreading visual-studio-2010 asynchronous

我在Windows 10上使用Visual Studio C#2010。

编辑:我的目标是创建一个中止按钮,允许我使用UI取消循环。

我正在使用我在网上找到的与this类似的示例: 这是代码:

 public void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {

                e.Result = "";
                for (int i = 0; i < 100; i++)
                {

                    System.Threading.Thread.Sleep(50); //do some intense task here.


                    if (backgroundWorker1.CancellationPending)
                    {
                        e.Cancel = true;
                        return;
                    }
                }

        }

(有一些代码共享日期/时间但我删除了它,因为它对基本示例来说是多余的。)

我是如何理解这段代码的,100次,代码暂停主线程并处理“一些紧张的任务”50ms。是这种情况吗?

如果是这样,我想我遇到了一个问题。我有我要运行的代码:

 private void btn_runtest_Click(object sender, EventArgs e)
        {

            // Exterior Platform Loop
                Output.AppendText("Starting Test \n");


            for (int i = 0; i <= 3200; i += 178)
            {

                // Interior Platform Loop
                for (int ii = 0; i <= 6400; ii += 178)
                {
                    comport7_interior.Write("@1N178\r");   //change to have actual length?
                    comport7_interior.Write("@1G\r");
                    Output.AppendText("Interior shift 5 degrees \n");

                    Thread.Sleep(4000);

                    // ***********************************************************************************
                    // Read data from comport2_lightsensor, Parse byte, store Lux value, store angle (i,ii)
                    // ***********************************************************************************
                }

                comport8_exterior.Write("@0N178\r");
                comport8_exterior.Write("@0G\r");
                Output.AppendText("Exterior shift 5 degrees \n");

               Thread.Sleep(4000);

               //flip direction for internal
               if (IsOdd(jjj))
               {
                   //
                   comport7_interior.Write("@1-\r");
                   Output.AppendText("Interior switching direction to counter clockwise \n");
                    }
                    else
                    {
                        comport7_interior.Write("@1+\r");
                        Output.AppendText("Interior switching direction to clockwise \n");
                    }
                    jjj = jjj + 1;

                    // ***********************************************************************************
                    // Read data from compart2_lightsensor, Parse byte, store Lux value, store angle (i,ii)
                    // ***********************************************************************************
                }
                Output.AppendText("Loop Ended");
                // manually reverse mount direction
                // repeat the whole double for loop

        }

这是非常“胖”的代码,总而言之,它控制两个步进电机,旋转它们以遵循所需的路径,暂停4秒,并最终记录数据。我们可以做确切的数学,但只是估计我们可以实现这段代码需要1-2个小时。所有这些暂停,似乎有利于分开处理100个小块(如果我对前面提到的代码的理解是正确的)。 纠正我我错了,但我不认为这段代码符合上述代码。

这是否意味着我在看错了方法?

提前谢谢大家。

0 个答案:

没有答案