C# Win 窗体 - 使用后台辅助角色时主线程无响应



我有一个数据网格视图,它正在通过数据源由DataTable填充,我正在使用后台工作器在datagridview中格式化单元格(单元格的背色和前景色(。

BackgroundWorker bw = new BackgroundWorker();
private void Frm_Find_Load(object sender, EventArgs e)
{
    bw.WorkerSupportsCancellation = true;
    bw.DoWork += new DoWorkEventHandler(bw_DoWork);
    bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
}
void bw_DoWork(object sender, DoWorkEventArgs e)
{
    CheckForValidValues();
}
public bool CheckForValidValues()
{
    dgv.Invoke((MethodInvoker)delegate()
    {
        for (int i = 0; i < Dt.Rows.Count; i++)
        {
            if (Dt.Rows[0]["Name"].ToString() == Value)
            {
                  dgv.Rows[i].Cells["Name"].Style.BackColor = Color.FromArgb(255, 192, 192);
            }
            else
            {
                   dgv.Rows[i].Cells["Name"].Style.BackColor = Color.White;
            }
            progressBar1.Invoke((MethodInvoker)(() => progressBar1.Value++));
        }
    });
    this.Invoke((MethodInvoker)delegate()
    {
        BtnShow.Enabled = true;
        dgv.Enabled = true;
    });
}
private void btnSave_Click(object sender, EventArgs e)
{
    if (bw.IsBusy == false)
    {
          progressBar1.Visible = true;
          progressBar1.Value = 0;
          BtnShow.Enabled = false;
          dgv.Enabled = false;
          progressBar1.Maximum = dgv.Rows.Count;
          bw.RunWorkerAsync();
    }
}

当整个过程下降时,DataGridView保持Enabled=false,因此用户无法更改DataGridView中的任何值。

datagridview 中通常有 15,000 行,并且要格式化很多行,这需要时间,这就是我为其使用后台工作者的原因,它工作得很好,但是当用户尝试按启用的假 datagridview 几次时,主线程变得无响应并且进度条冻结。

谁能指导我如何处理它?

您正在使用 Invoke 运行整个代码。这意味着您正在切换到 UI 线程,并且代码正在 UI 线程中运行。由于代码是一个耗时的for循环,因此它会阻塞 UI 线程。

与其使用 BackgroundWorker 来格式化单元格,不如使用 CellFormatting 事件:

private void dgv_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
    //If this is header cell or new row, do nothing
    if (e.RowIndex < 0 || e.ColumnIndex < 0 || e.RowIndex == dgv.NewRowIndex)
        return;
    //If formatting your desired column, perform validation
    if (e.ColumnIndex == dgv.Columns["Name"].Index)
    {
        // Perform validation and change cell back color here.
    }
}

也许尝试在单击按钮时禁用按钮,直到工作完成?

假设您的按钮名称是按钮 1,

当用户单击">已启用的假数据"网格视图时,使用 Button.enabled=false,然后在作业完成后使用 Button.enabled=true

希望对您有所帮助!

最新更新