2016-04-18 85 views
2

我想在BackgroundWorker中将一些数据填充到我的自定义网格中。如果数据很小,那么它工作正常,但如果数据很大,我会随机收到例外。有时我得到“NullReferenceException未被用户代码处理”,有时候我得到“ArgumentOutOfRangeException未被用户代码处理”。下面我提到了一些我正面临的例外情况。使用BackgroundWorker时出现异常

基本上我在做的Populate()方法是通过使用foreach循环,我分配每个单元格的值在我的自定义网格中。当我不使用BackgroundWorker时,这工作正常。但是在使用BackgroundWorker的同时,我将它分配给单元格时得到空值。因此出现了很多例外。我不知道为什么会发生这种情况。有什么建议可以解决这个问题吗?

下面是我使用

代码代码:

BackgroundWorker worker = new BackgroundWorker(); 

worker.DoWork += (sender, args) => 
{ 
if (this.PivotEngine.DataSource != null && this.PivotCalculations.Count > 0) 
{ 

    // Populates the data for the grid. 
    // Without using the BackgroundWorker, the values are been populated properly. 
    this.PivotEngine.Populate();   

} 

}; 

worker.RunWorkerCompleted += (s, e) => 
{ 
MessageBox.Show("Process is complete"); 
}; 

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

Exception1:

Exception: 
System.NullReferenceException was unhandled by user code 
HResult=-2147467261 
Message=Object reference not set to an instance of an object. 
Source=Syncfusion.PivotAnalysis.Base 
StackTrace: 
    at Syncfusion.PivotAnalysis.Base.PivotEngine.PopulatePivotTable() in d:\Work_Vol4\svn\studio\trunk\work_area\GridWF\Engineer\PivotAnalysis.Base\Src\Engine\PivotEngine.cs:line 5882 
    at Syncfusion.PivotAnalysis.Base.PivotEngine.ResumeComputations(Boolean resetPivotCollections, Boolean shouldRefresh) in d:\Work_Vol4\svn\studio\trunk\work_area\GridWF\Engineer\PivotAnalysis.Base\Src\Engine\PivotEngine.cs:line 2735 
    at Syncfusion.PivotAnalysis.Base.PivotEngine.ResumeComputations(Boolean resetPivotCollections) in d:\Work_Vol4\svn\studio\trunk\work_area\GridWF\Engineer\PivotAnalysis.Base\Src\Engine\PivotEngine.cs:line 2718 
    at Syncfusion.PivotAnalysis.Base.PivotEngine.Populate() in d:\Work_Vol4\svn\studio\trunk\work_area\GridWF\Engineer\PivotAnalysis.Base\Src\Engine\PivotEngine.cs:line 2829 
    at Syncfusion.Windows.Forms.PivotAnalysis.PivotGridControlBase.Populate(PivotEngine pe, Boolean checkLazyLoading) in d:\Work_Vol4\svn\studio\trunk\work_area\GridWF\Engineer\PivotAnalysis.Windows\Src\PivotGridControl\Core\PivotGridControlBase.cs:line 2990 
    at Syncfusion.Windows.Forms.PivotAnalysis.PivotGridControlBase.<>c__DisplayClass1d.<ApplyRowCols>b__1a(Object sender, DoWorkEventArgs args) in d:\Work_Vol4\svn\studio\trunk\work_area\GridWF\Engineer\PivotAnalysis.Windows\Src\PivotGridControl\Core\PivotGridControlBase.cs:line 3016 
    at System.ComponentModel.BackgroundWorker.OnDoWork(DoWorkEventArgs e) 
    at System.ComponentModel.BackgroundWorker.WorkerThreadStart(Object argument) 
InnerException: 

Exception2:

System.ArgumentOutOfRangeException was unhandled by user code 
HResult=-2146233086 
Message=Index was out of range. Must be non-negative and less than the size of the collection. 
Parameter name: index 
Source=mscorlib 
ParamName=index 
StackTrace: 
    at System.ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument argument, ExceptionResource resource) 
    at System.Collections.Generic.List`1.get_Item(Int32 index) 
    at Syncfusion.PivotAnalysis.Base.PivotEngine.PopulatePivotTable() in d:\Work_Vol4\svn\studio\trunk\work_area\GridWF\Engineer\PivotAnalysis.Base\Src\Engine\PivotEngine.cs:line 5932 
    at Syncfusion.PivotAnalysis.Base.PivotEngine.ResumeComputations(Boolean resetPivotCollections, Boolean shouldRefresh) in d:\Work_Vol4\svn\studio\trunk\work_area\GridWF\Engineer\PivotAnalysis.Base\Src\Engine\PivotEngine.cs:line 2735 
    at Syncfusion.PivotAnalysis.Base.PivotEngine.ResumeComputations(Boolean resetPivotCollections) in d:\Work_Vol4\svn\studio\trunk\work_area\GridWF\Engineer\PivotAnalysis.Base\Src\Engine\PivotEngine.cs:line 2718 
    at Syncfusion.PivotAnalysis.Base.PivotEngine.Populate() in d:\Work_Vol4\svn\studio\trunk\work_area\GridWF\Engineer\PivotAnalysis.Base\Src\Engine\PivotEngine.cs:line 2829 
    at Syncfusion.Windows.Forms.PivotAnalysis.PivotGridControlBase.Populate(PivotEngine pe, Boolean checkLazyLoading) in d:\Work_Vol4\svn\studio\trunk\work_area\GridWF\Engineer\PivotAnalysis.Windows\Src\PivotGridControl\Core\PivotGridControlBase.cs:line 2990 
    at Syncfusion.Windows.Forms.PivotAnalysis.PivotGridControlBase.<>c__DisplayClass1d.<ApplyRowCols>b__1a(Object sender, DoWorkEventArgs args) in d:\Work_Vol4\svn\studio\trunk\work_area\GridWF\Engineer\PivotAnalysis.Windows\Src\PivotGridControl\Core\PivotGridControlBase.cs:line 3016 
    at System.ComponentModel.BackgroundWorker.OnDoWork(DoWorkEventArgs e) 
    at System.ComponentModel.BackgroundWorker.WorkerThreadStart(Object argument) 
InnerException: 

我在使用BackgroundWorker时丢失了什么。任何帮助将非常感激。

Regards,

Anish。

+0

检查您的OnDoWork中是否存在this.PivotEngine不为空 –

+0

是的。问题出在背景工作者没有定义的'this'上。您必须将“this”作为状态对象传递给后台工作者。背景工作者与您正在运行的表单是一个单独的过程。所以你需要将表单的实例传递给backgroundworker。 – jdweng

+0

您的背景工作者正在为DataGridViewCell对象分配值。这个类的方法不是线程安全的。这可能是问题吗?不应该使用事件BackGroundWorker.ProgressChanged将新单元格值传递给UI线程,并让UI线程执行单元格值更改?其他方法:让背景工作者创建并填充绑定源。使用事件RunWorkerCompleted将填充的BindingSource传递给UI线程,并让UI线程将DataGridView的DataSource分配给此绑定源 –

回答

0

虽然使用堆栈跟踪和全部检查,但似乎Populate()方法本身在ResumeComputation()方法后调用两次。

在Syncfusion.PivotAnalysis.Base.PivotEngine.PopulatePivotTable()在 d:\ Work_Vol4 \ SVN \工作室\树干\ work_area \ GridWF \工程师\ PivotAnalysis.Base \ SRC \引擎\ PivotEngine.cs:线 5932在 d Syncfusion.PivotAnalysis.Base.PivotEngine.ResumeComputations(布尔 resetPivotCollections,布尔shouldRefresh):\ Work_Vol4 \ SVN \工作室\树干\ work_area \ GridWF \工程师\ PivotAnalysis.Base \ SRC \引擎\ PivotEngine。 cs:line 2735 at Syncfusion.PivotAnalysis.Base.PivotEngine.ResumeComputations(Boolean resetPivotCollections)in d:\ Work_Vol4 \ svn \ studio \ trunk \ work_area \ GridWF \ Engineer \ PivotAnalysis.Base \ Src \ Engine \ PivotEngine.cs:line 2718 at Syncfusion.PivotAnalysis.Base.PivotEngine.Populate()in d:\ Work_Vol4 \ svn \ studio \ trunk \ work_area \ GridWF \工程师\ PivotAnalysis.Base的\ src \发动机\ PivotEngine.cs:行 2829在 Syncfusion.Windows.Forms.PivotAnalysis.PivotGridControlBase.Populate(PivotEngine PE,

你必须避免这种重复递归调用来停止这个异常。

相关问题