A BackgroundWorker returning null without Exception error when the same operations done outside of it return a value(当在其外部执行的相同操作返回值时,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,而不会出现异常错误
- 带有服务/守护程序应用程序的 Microsoft Graph CSharp SDK 和 OneDrive for Business - 配额方面返回 null 2022-01-01
- Web Api 中的 Swagger .netcore 3.1,使用 swagger UI 设置日期时间格式 2022-01-01
- 良好实践:如何重用 .csproj 和 .sln 文件来为 CI 创建 2022-01-01
- 如何用自己压缩一个 IEnumerable 2022-01-01
- C#MongoDB使用Builders查找派生对象 2022-09-04
- 在哪里可以找到使用中的C#/XML文档注释的好例子? 2022-01-01
- WebMatrix WebSecurity PasswordSalt 2022-01-01
- 输入按键事件处理程序 2022-01-01
- MoreLinq maxBy vs LINQ max + where 2022-01-01
- C# 中多线程网络服务器的模式 2022-01-01