Winform如何处理方法冻结UI

时间:2014-03-10 17:59:37

标签: c# winforms

我目前有一个方法,可以使用更多模式扩展的变量创建一个字符串,然后将该字符串发送到串行端口。启用串口写入会冻结UI,但没有它,它运行正常。

private void OnTimedEvent(Object myObject, EventArgs myEventArgs)
    {            
        l = (l > 100) ? 100 : l;
        r = (r > 100) ? 100 : r;

        mRectangle1 = new RectangleF(13, 153, 80 * (l / 100), 16);
        mRectangle2 = new RectangleF(173 - (80 * (r / 100)), 153, 80 * (r / 100), 16);

        string start = "";

        for (int i = 0; i < 25; i++)
        {
            start += "0:" + Math.Round(255 * (l / 100)) + ":0;";
        }

        start += ".";
        port.Write(start);
        Invalidate();
    }

我如何才能最好地解决这个问题,这样我就可以不断冻结串口来发送串口?

1 个答案:

答案 0 :(得分:3)

您可以使用BackgroundWorker类来执行此操作。

DoWork事件是在后台线程上完成可能耗时的工作的地方。您可以将start参数传递给引发DoWork事件的RunWorkerAsync(object)方法。

快速举例:

// start the work in the background thread like this
backgroundWorker1.RunWorkerAsync(start);

// handles the time-consuming task without blocking the UI thread
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{   
    string start = (string) e.Argument;
    port.Write(start);
}