当在其外部执行的相同操作返回值时,BackEarth Worker返回NULL,而不会出现异常错误

A BackgroundWorker returning null without Exception error when the same operations done outside of it return a value(当在其外部执行的相同操作返回值时,BackEarth Worker返回NULL,而不会出现异常错误)

本文介绍了当在其外部执行的相同操作返回值时,BackEarth Worker返回NULL,而不会出现异常错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有几个后台工作人员都在选项卡页中执行相同的任务:他们从MySQL数据库中提取数据,并在完成后更新图表的BindingSource

其中一个最近开始调皮捣蛋了。代码如下:

private void bgwRefreshChartMoisCourant_DoWork(object sender, DoWorkEventArgs e)
{
      trimlineSalesReportDataSet.viewventesparutilisateurmoiscourantDataTable dT = new trimlineSalesReportDataSet.viewventesparutilisateurmoiscourantDataTable();

      this.viewventesparutilisateurmoiscourantTableAdapter.Fill(dT);
      e.Result = dT;
}

private trimlineSalesReportDataSet.viewventesparutilisateurmoiscourantDataTable salesThisMonthDataTable = new trimlineSalesReportDataSet.viewventesparutilisateurmoiscourantDataTable();

private void bgwRefreshChartMoisCourant_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
      salesThisMonthDataTable = new trimlineSalesReportDataSet.viewventesparutilisateurmoiscourantDataTable();
      salesThisMonthDataTable = (trimlineSalesReportDataSet.viewventesparutilisateurmoiscourantDataTable)e.Result;

      this.viewventesparutilisateurmoiscourantBindingSource.DataMember = "";
      this.viewventesparutilisateurmoiscourantBindingSource.DataSource = salesThisMonthDataTable; 
            
      // If the sales are null at the beginning of a month, the filter and sorting will throw an error
      if (e.Result!=null)
      {
          this.viewventesparutilisateurmoiscourantBindingSource.Filter = "Total<>0 AND Vendeur<>'Total'";
          this.viewventesparutilisateurmoiscourantBindingSource.Sort = "Total ASC";
      }

      this.chartSalespersonsThisMonth.DataSource = this.viewventesparutilisateurmoiscourantBindingSource;
      this.chartSalespersonsThisMonth.DataBind();
}

现在很奇怪,因为我不能单步执行BackgroundWorker_DoWork事件,如果我将代码复制到中,如下所示,那么我得到的是实际数据,而不是空数据。

private void bgwRefreshChartMoisCourant_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
      // Temporary fix for Background Worker e.Result which is null for some reason, with no Exception error thrown (e.Cancel and e.Error are both null)
      trimlineSalesReportDataSet.viewventesparutilisateurmoiscourantDataTable dT = new trimlineSalesReportDataSet.viewventesparutilisateurmoiscourantDataTable();
      this.viewventesparutilisateurmoiscourantTableAdapter.Fill(dT);

      salesThisMonthDataTable = new trimlineSalesReportDataSet.viewventesparutilisateurmoiscourantDataTable();
      salesThisMonthDataTable = (trimlineSalesReportDataSet.viewventesparutilisateurmoiscourantDataTable)e.Result;

      this.viewventesparutilisateurmoiscourantBindingSource.DataMember = "";
      this.viewventesparutilisateurmoiscourantBindingSource.DataSource = dT;      // Temporary fix
            
      // If the sales are null at the beginning of a month, the filter and sorting will throw an error
      if (e.Result!=null)
      {
          this.viewventesparutilisateurmoiscourantBindingSource.Filter = "Total<>0 AND Vendeur<>'Total'";
          this.viewventesparutilisateurmoiscourantBindingSource.Sort = "Total ASC";
      }

      this.chartSalespersonsThisMonth.DataSource = this.viewventesparutilisateurmoiscourantBindingSource;
      this.chartSalespersonsThisMonth.DataBind();
}

这怎么可能?同一代码如何在一个线程中返回空值,而在另一个线程中返回一组数据?

我最近对本部分中的代码所做的唯一更改是添加了if (e.Result!=null)部分,因为没有当前月份的数据,并且当设置排序属性时,它将抛出异常错误。但现在有了数据,只是看不到而已。几个月来,它一直运行良好。除了这个月是新的一年,其他什么都没有改变。起初我认为MySQL视图有缺陷,但事实并非如此。

您认为我可以找出问题出在哪里吗?

推荐答案

在问题下的注释中对此进行诊断,结果是dowork事件处理程序代码已从dowork事件解除绑定。在与设计者一起工作时,我曾在各种控件中时不时地遇到这种情况。

参考计数的代码透镜也可以提示这一点:

顺便说一句,我要说的是,您的代码可能可以折叠为以下内容:

private void bgwRefreshChartMoisCourant_DoWork(object sender, DoWorkEventArgs e)
{
      e.Result = this.VenParMoisCourTableAdapter.GetData();
}

private void bgwRefreshChartMoisCourant_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
      this.VenParMoisCourBindingSource.DataSource = e.Result;
      
      this.VenParMoisCourBindingSource.Filter = "Total<>0 AND Vendeur<>'Total'";
      this.VenParMoisCourBindingSource.Sort = "Total ASC";
}

GetData应始终返回DataTable,即使它为空,因此您也许能够跳过NULL检查

另外,您可能已经知道了,但您始终可以在数据集中右键单击您的TableAdapter,并添加更多执行其他筛选的查询,以便

SELECT * FROM VenParMoisCour WHERE Total<>0 AND Vendeur<>'Total' ORDER BY Total

将首先保存正在下载的记录。当被询问时,给查询起一个好名字,如FillAllExceptZeroTotal/GetDataByAllExceptZeroTotal,您可以

private void bgwRefreshChartMoisCourant_DoWork(object sender, DoWorkEventArgs e)
{
      e.Result = this.VenParMoisCourTableAdapter.GetDataByAllExceptZeroTotal();
}

private void bgwRefreshChartMoisCourant_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
      this.VenParMoisCourBindingSource.DataSource = e.Result;
}

这篇关于当在其外部执行的相同操作返回值时,BackEarth Worker返回NULL,而不会出现异常错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本文标题为:当在其外部执行的相同操作返回值时,BackEarth Worker返回NULL,而不会出现异常错误