【问题标题】:Some clarification on Background Worker [duplicate]关于后台工作人员的一些说明[重复]
【发布时间】:2016-11-07 15:59:32
【问题描述】:

一直在阅读后台工作程序,主要是 doWork 方法。它表示这应该有计算,但无论如何都不应该依赖于 GUI 代码。这是我的功能:

void fillLiguanea()
{
    //  this.liguanea_LaneTableAdapter1.Fill(this.pharmaciesDataSet1.Liguanea_Lane);
    try
    {
        string connectionString = "Data Source=LPMSW09000012JD\\SQLEXPRESS;Initial Catalog=Pharmacies;Integrated Security=True";
        SqlConnection con = new SqlConnection(connectionString);
        con.Open();
        string query = "SELECT * FROM dbo.Liguanea_Lane2";
        SqlCommand cmd = new SqlCommand(query, con);

        SqlDataReader dr = cmd.ExecuteReader();
        while (dr.Read())
        {
            string scode = dr.GetString(dr.GetOrdinal("code"));
            comboBox2.Items.Add(scode);
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.ToString());
    }
}

在上述函数中有一个名为“comboBox2”的组合框。我的问题是这是否意味着我不能仅仅因为这个组合框控制器而在 doWork 方法中调用我的上述整体函数?

【问题讨论】:

  • 填写List<string>并将其分配给e.Result。然后,您的 RunWorkerCompleted 事件处理程序可以更新组合框。
  • 已经有很多关于 Stack Overflow 的问题和答案,解决了如何与来自另一个线程的 UI 对象交互,包括BackgroundWorker 使用的工作线程。有关此类示例,请参见标记的副本。如果您发现自己仍然有困难,请在阅读大量可用信息后发布一个新问题,其中包含一个很好的minimal reproducible example,清楚地显示您尝试过的内容,并详细说明您已经完成的研究和具体而言您仍然无法理解的内容。

标签: c# winforms backgroundworker


【解决方案1】:

如果您使用 .Net 4.5 或更高版本支持 async/await,Backgroundworker 基本上已过时。因此,如果您要学习新的东西,我建议您学习。

如果您仍要使用 backgroundworker,您将在 while 循环中引发 ProgressChanged 事件,并在该事件处理程序的实现中进行组合框操作,以便您可以访问 UI 线程。

编辑

由于确实没有理由随时更新组合框,因此我会采纳 Hans 的建议。

【讨论】:

    【解决方案2】:

    基本思想是您不能从当前后台工作线程(doWork 函数)进行任何 gui 调用或更改,原因很简单,不是该线程而是创建图形对象的主线程。 (不能修改在不同线程下实例化的对象)

    这就是为什么后台worker类支持progress changed或completed等方法,你可以在其中修改UI。

    但要小心调用,使用 invoke_required 会更安全。

    查看谷歌有关如何进行安全跨线程操作的文章

    【讨论】:

      猜你喜欢
      • 2013-10-07
      • 1970-01-01
      • 1970-01-01
      • 2014-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多