如何修复循环崩溃程序

时间:2018-09-09 00:58:52

标签: c#

我正在尝试在Visual Studio中按下检查按钮时连续发送串行数据。到目前为止,这是我想出的:

private void checkBox1_CheckedChanged_1(object sender, EventArgs e)
    {
        while (checkBox1.Checked)
        {
            serialPort1.Write("D");
            Task.Delay(100);
            if (checkBox1.Checked != true)
            {
                break;
            }
        }                                            `    

由于某种原因,每当我启动该程序并选中该框时,该程序 冻结。我无法退出程序或将其最小化。它只是停在自己的轨道上。

2 个答案:

答案 0 :(得分:1)

Windows中的用户界面基于消息。 while循环在将处理这些消息的线程中运行。您的代码运行时,不会处理任何消息。用户界面无法重绘,并且无法对用户输入做出反应。

更好的方法:使用Timer组件。计时器的Tick事件将根据Interval的{​​{1}}属性每n毫秒执行一次。在Timer事件中,您可以检查Checkbox状态,然后根据是否选中了复选框来执行某些操作。

如果“做某事”的时间很短,那么这是一个好方法。对于更长的活动,除非您提供更多详细信息,否则您将需要进行一些更为复杂的设置,这超出了SO问题的范围。

答案 1 :(得分:0)

您正在阻止UI线程,因为您的事件正在同步处理。有关异步/等待编程的一些技巧,请参考以下答案:How do I update the GUI from another thread?