使用BackgroundWorker解决窗口卡死

使用控件 BackgroundWorker 的实质是为该进程新创建一个线程来执行耗时操作。

bool changed = false;

private void tabControl1_Selected(object sender, TabControlEventArgs e)
{
    changed = true;
    if (!backgroundWorker1.IsBusy)
    {
        if (changed)
        {
            backgroundWorker1.RunWorkerAsync();
        }
    }
}

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    // time-consuming operations
    int sum = 0;
    for (int i = 0; i < int.MaxValue; i++)
    {
        sum += i;
    }
    textBox1.Text = sum.ToString();
    // time-consuming operations
    changed = false;
}

与直接创建一个线程相比,BackgroundWorker 不需要忽视控件多线程的安全机制,详见解决界面卡死的问题

还可以使用 BackgroundWorker 异步创建新的窗口:

private void Open_Click(object sender, EventArgs e)
{
    this.backgroundWorker1.RunWorkerAsync();
}

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    ExternalForm ef = new ExternalForm();
    ef.ShowDialog();
}
原文地址:https://www.cnblogs.com/jizhiqiliao/p/9951079.html