【问题标题】:BackgroundWorker not working properlyBackgroundWorker 无法正常工作
【发布时间】:2015-07-02 00:14:41
【问题描述】:

我正在使用后台工作程序,因为我的程序中的某些方法需要时间从互联网下载数据。此方法“阻塞”软件 5-6 秒,所以我想使用后台工作者像线程一样执行该方法。在我的课堂上,我创建了这个:

 private BackgroundWorker worker = new BackgroundWorker();

之后,在 ComboBox 选择改变后,我以这种方式调用 BackgroundWorker:

worker.DoWork += new DoWorkEventHandler(doWork);

doWork 方法包含:

public void doWork(object sender, DoWorkEventArgs e)
{
        classifica.getClassifica(); //call the method from another class
}

现在我的问题是 BackgroundWorker 没有调用方法 doWork。 我做错了什么?

【问题讨论】:

  • 你开始了吗?此外,您不需要 BackgroundWorker 在后台运行某些东西。首选方法是使用async/await 创建异步事件处理程序。
  • 调用worker.DoWork没有自动启动?
  • 不,你需要在工作对象上调用RunWorkerAsync
  • 首先,您不会在任何地方调用它。其次,不,DoWork 是事件处理程序。您需要拨打RunWorkerAsync 启动它
  • 唯一的问题是该方法已执行但未填充DataGrid。可能是后台工作人员导致了这个错误?

标签: c# wpf


【解决方案1】:

你必须启动工人。

 worker.RunWorkerAsync();

【讨论】:

    【解决方案2】:

    我想你正在寻找这个:

    if (worker.IsBusy != true)
    {
        worker.RunWorkerAsync();
    }
    

    尽管除非您设置在 BackGroundWorker 上或无法以 .NET 4.5 为目标,否则我强烈推荐 WebClient.DownloadDataAsync

    像这样使用它:

    static void DownloadData()
    {
        string url = "http://google.com";
        WebClient client = new WebClient();
        client.DownloadDataCompleted += DownloadDataCompleted;
        client.DownloadDataAsync(new Uri(url));
    }
    
    static void DownloadDataCompleted(object sender,
    DownloadDataCompletedEventArgs e)
    {
        // Handle returned data here
    }
    

    为您完成所有这些工作,而无需使用其他任何东西。简单!

    【讨论】:

      【解决方案3】:

      你需要这样启动后台worker

      if (bw.IsBusy != true)
      {
          bw.RunWorkerAsync();
      }
      

      更多详情请关注https://msdn.microsoft.com/fr-fr/library/cc221403(v=vs.95).aspx

      【讨论】:

        【解决方案4】:

        你必须调用worker.RunWorkerAsync(); 来启动worker。 还有一个重载允许您将object 参数传递给您的DoWork 函数:

        void RunWorkerAsync(object argument)
        

        您还可以添加一个处理程序,以便您知道工作人员何时完成:worker.RunWorkerCompleted。在这个处理程序中,您可以访问 DataGrid,因为它将在 UI 线程中(假设您在 UI 线程中创建了工作线程)

        【讨论】:

        • 我已经执行了worker.RunWorkerAsync()但是方法没有执行。
        • 你是在添加DoWork处理程序后调用它吗?
        • 还有@HaroldFinch,确保在处理程序有机会执行之前主程序没有退出。
        • 我需要填充 DataGrid,所以我需要调用 GUI 的线程。如何做到这一点?
        • @HaroldFinch - 您需要添加一个处理程序,以便您知道工作人员何时完成:worker.RunWorkerCompleted。在这个处理程序中,您可以访问 DataGrid,因为它将在 UI 线程中(假设您在 UI 线程中创建了工作线程)
        猜你喜欢
        • 1970-01-01
        • 2016-12-01
        • 1970-01-01
        • 2016-09-01
        • 2012-07-11
        • 2018-04-08
        • 2017-04-20
        • 2018-10-02
        • 2016-09-04
        相关资源
        最近更新 更多