2016-04-18 16 views
2

Ich versuche, einige Daten zu meinem benutzerdefinierten Raster im BackgroundWorker zu füllen. Wenn die Daten klein sind, funktioniert es gut, aber wenn die Daten groß sind, bekomme ich zufällig Ausnahmen. Manchmal bekomme ich "NullReferenceException wurde von Benutzercode nicht behandelt" und manchmal bekomme ich "ArgumentOutOfRangeException wurde von Benutzercode nicht behandelt". Im Folgenden habe ich einige der Ausnahmen erwähnt, mit denen ich konfrontiert bin.Ausnahme bei der Verwendung von BackgroundWorker

Grundsätzlich, was ich in Populate() Methode mache, ist, dass ich mit foreach-Schleife die Werte jeder Zelle in meinem benutzerdefinierten Raster zuweisen. Dies funktioniert gut, wenn ich den BackgroundWorker nicht verwende. Aber während ich den BackgroundWorker verwende, erhalte ich Nullwerte, während ich ihn der Zelle zuweise. Daher ergeben sich viele Ausnahmen. Ich weiß nicht, warum das passiert. Gibt es Vorschläge, dies zu überwinden?

Unten finden Sie den Code, ich

-Code verwende:

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: 

Fehle ich etwas während der Verwendung des BackgroundWorker. Jede Hilfe würde sehr geschätzt werden.

Grüße,

Anish.

+0

Überprüfen Sie, dass this.PivotEngine in Ihrem OnDoWork nicht null ist –

+0

Ja. Das Problem ist mit "Dies", das nicht im Hintergrundarbeiter definiert ist. Sie müssen "dies" als Statusobjekt an den Hintergrundarbeiter übergeben. Der Hintergrundarbeiter ist ein separater Prozess von dem Formular, das Sie ausführen.Sie müssen also die Instanz des Formulars an den Hintergrundarbeiter übergeben. – jdweng

+0

Ihr Hintergrundarbeiter weist DataGridViewCell-Objekten Werte zu. Die Methoden dieser Klasse sind nicht Thread-sicher. Könnte das das Problem sein? Sollten Sie das Ereignis BackGroundWorker.ProgressChanged nicht verwenden, um einen neuen Zellenwert an den Benutzeroberflächenthread zu übergeben und den Zellenwert ändern zu lassen? Andere Methode: Lassen Sie den Hintergrundarbeiter eine Bindungsquelle erstellen und füllen. Übergeben Sie die gefüllte BindingSource mit dem Ereignis RunWorkerCompleted an den UI-Thread, und weisen Sie der Bindungsquelle die DataSource der DataGridView zu. –

Antwort

0

Bei der Überprüfung mit dem Stack-Trace und allen scheint die Methode Populate() selbst zweimal nach der Methode ResumeComputation() aufgerufen zu werden.

bei Syncfusion.PivotAnalysis.Base.PivotEngine.PopulatePivotTable() in d: \ Work_Vol4 \ svn \ Studio \ trunk \ work_area \ GridWF \ \ PivotAnalysis.Base \ Src \ Engine \ PivotEngine.cs Ingenieur: line 5932 bei Syncfusion.PivotAnalysis.Base.PivotEngine.ResumeComputations (Boolean resetPivotCollections, Boolean shouldRefresh) in d: \ Work_Vol4 \ svn \ Studio \ trunk \ work_area \ GridWF \ Ingenieur \ PivotAnalysis.Base \ Src \ Engine \ PivotEngine. cs: line 2735 um Syncfusion.PivotAnalysis.Base.PivotEngine.ResumeComputations (Boolean resetPivotCollections) in d: \ Work_Vol4 \ svn \ studio \ trunk \ work_area \ GridWF \ Engineer \ PivotAnalysis.Base \ Src \ Engine \ PivotEngine.cs: Zeile 2718 bei Syncfusion.PivotAnalysis.Base.PivotEngine.Populate() in d: \ Work_Vol4 \ svn \ studio \ trunk \ work_area \ GridWF \ Ingenieur \ PivotAnalysis.Base \ Src \ Engine \ PivotEngine.cs: Linie 2829 bei Syncfusion.Windows.Forms.PivotAnalysis.PivotGridControlBase.Populate (PivotEngine pe,

Sie müssen vermeiden, so wiederholt rekursive Aufrufe, um diese Ausnahme zu stoppen.

Verwandte Themen