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.
Überprüfen Sie, dass this.PivotEngine in Ihrem OnDoWork nicht null ist –
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
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. –