Winform如何处理方法冻结UI

本文关键字:方法 冻结 UI 处理 何处理 Winform | 更新日期: 2023-09-27 17:49:32

我目前有一个方法,从变量中创建一个字符串,该字符串将扩展为更多模式,然后它将该字符串发送到串行端口。启用串行端口写入时,会冻结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();
    }

我该如何最好地处理这个,所以我可以不断发送串行端口而不冻结UI?

Winform如何处理方法冻结UI

您可以使用BackgroundWorker类来完成此操作。

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

快速的例子:

// 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);
}