【问题标题】:Windowsform UI gets unresponsive even with background worker即使使用后台工作程序,Windows 窗体 UI 也会无响应
【发布时间】:2014-11-07 15:15:15
【问题描述】:

我有一个使用 C# 的应用程序的 Windows 在这种形式中,我有一个按钮,它从 MSSQL 中的几个表中检索数据并将其显示在 DataGridView 中。我已经使用后台工作人员来获取视图,并且我有一个进度条,我想将其设置为选取框以向用户显示正在发生的事情,但是即使我在 DoWork 方法中有数据检索代码,进度条也没有响应,这是一些代码

The button calls the fillData() method and that method is as follows

public void fillData()
        {
            if (ConnectionString == "")
            {
                MessageBox.Show("You must connect to the server first", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            toolStripProgressBar1.Visible = true;
            toolStripProgressBar1.Style = ProgressBarStyle.Marquee;
            toolStripProgressBar1.MarqueeAnimationSpeed = 50;

//....更多代码在这里然后...

                System.ComponentModel.BackgroundWorker backgroundworker1 = new System.ComponentModel.BackgroundWorker();
                backgroundworker1.DoWork += new System.ComponentModel.DoWorkEventHandler(this.backgroundWorker1_DoWork);
                backgroundworker1.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.backgroundworker1_RunWorkerCompleted);

                backgroundworker1.RunWorkerAsync();
}

然后我有 DoWork 方法

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        Data.Tables.Clear();
        Data.Locale = System.Globalization.CultureInfo.InvariantCulture;
        System.Data.SqlClient.SqlDataAdapter masterDA = new SqlDataAdapter(sqlString, conn);
        masterDA.Fill(Data, "ORDERS");
    }

和 RunWorkerCompleted

    private void backgroundworker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        toolStripProgressBar1.MarqueeAnimationSpeed = 0;
        ordersDGV.DataSource = Data.Tables[0];
        recordnoTSSL.Text = ordersDGV.Rows.Count.ToString();
    }

但是一旦调用后台工作人员,UI 就会无响应,我认为这种技术可以让我显示进度条并保持 UI 响应, 我做错了什么?

【问题讨论】:

    标签: datagridview progress-bar backgroundworker


    【解决方案1】:

    你有几个选择来解决这个问题。

    1:从 sql 获取异步数据表不需要后台工作人员。使用 SqlCommand BeginExecuteReader 您可以异步获取数据,请参阅http://msdn.microsoft.com/en-us/library/7szdt0kc.aspx

    2:你不应该在 DoWork 方法中进行跨线程调用。在 DoWork 中创建一个数据集并将其设置为结果。在 RunWorkerCompleted 中,您可以将数据集或数据表分配为数据源:

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        var dataSet = new DataSet();
        dataSet.Locale = System.Globalization.CultureInfo.InvariantCulture;
        System.Data.SqlClient.SqlDataAdapter masterDA = new SqlDataAdapter(sqlString, conn);
        masterDA.Fill(dataSet, "ORDERS");
        e.Result = dataSet;
    }
    
    private void backgroundworker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        if ( e.Error != null )
        {
            // handle exception
        }
        var dataSet = e.Result;
        ordersDGV.DataSource = dataSet.Tables[0];
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-11
      • 1970-01-01
      • 1970-01-01
      • 2015-09-22
      • 1970-01-01
      相关资源
      最近更新 更多