我有幾個BackgroundWorkers都在做同樣的作業在TabPage的:他們從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事件,如果我將代碼復制到RunWorkerCompleted 中,如下所示,那么我得到的是真實資料,而不是 null。
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)部分,因為當月沒有資料,并且當設定了Sort屬性時,它會拋出例外錯誤。但是現在有了資料,只是沒有看到而已。幾個月來一直運行良好。除了這個月是新的一年,其他什么都沒有改變。起初我認為MySQL View有缺陷,但不是。
關于為什么甚至如何找出問題所在的任何想法?
uj5u.com熱心網友回復:
在問題下的評論中對此進行了診斷,結果表明 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 應該總是回傳一個資料表,即使它是空的,所以你可以跳過空檢查
此外,也許您已經知道,但您始終可以右鍵單擊資料集中的 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;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/407129.html
標籤:
