2016-04-18 19 views
2

BackgroundWorkerのカスタムグリッドにデータを取り込もうとしています。データが小さい場合は正常に動作していますが、データが大きい場合はランダムに例外が発生します。時には "NullReferenceExceptionがユーザーコードによって処理されていません"と表示され、 "ArgumentOutOfRangeExceptionがユーザーコードによって未処理"になっていることがあります。以下は、私が直面している例外のいくつかを述べました。BackgroundWorkerを使用中に例外が発生しました

私がPopulate()メソッドで行っていることは、foreachループを使用することによって、私のカスタムグリッド内の各セルの値を割り当てていることです。これは、私がBackgroundWorkerを使用していないときにうまく動作します。しかし、BackgroundWorkerを使用している間、セルに割り当てる際にnull値を取得しています。したがって、多くの例外が発生します。なぜこれが起こっているのか分かりません。これを克服するための提案はありますか?

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を使用している間に何か不足していますか?どんな助けでも大いに感謝されるでしょう。

ありがとう、

アニッシュ。

+0

このピボットエンジンがあなたのOnDoWorkの中でヌルでないことを確認してください。 –

+0

はい。問題は「これ」で、これはバックグラウンドワーカーには定義されていません。あなたはバックグラウンドワーカーに状態オブジェクトとして 'this'を渡す必要があります。バックグラウンドワーカーは、実行しているフォームとは別のプロセスです。したがって、フォームのインスタンスをバックグラウンドワーカーに渡す必要があります。 – jdweng

+0

バックグラウンドワーカーがDataGridViewCellオブジェクトに値を割り当てています。このクラスのメソッドはスレッドセーフではありません。それが問題だろうか? BackGroundWorker.ProgressChangedイベントを使用して新しいセル値をUIスレッドに渡すべきではなく、UIスレッドがセル値の変更を行うようにすべきですか?他の方法:バックグラウンド作業者にバインディングソースを作成してもらう。イベントRunWorkerCompletedを使用して、埋め込まれたBindingSourceをUIスレッドに渡し、UIスレッドがDataGridViewのDataSourceをこのバインディングソースに割り当てるようにします。 –

答えて

0

スタックトレースとallで確認すると、ResumeComputation()メソッドの後にPopulate()メソッド自体が2回呼び出されたようです。

dはSyncfusion.PivotAnalysis.Base.PivotEngine.PopulatePivotTable()で

:\ Work_Vol4 \ SVN \スタジオ\トランク\ work_area \ GridWF \ \ PivotAnalysis.Base \ SRC \エンジン\ PivotEngine.csエンジニア:行 dは Syncfusion.PivotAnalysis.Base.PivotEngine.ResumeComputations(ブール resetPivotCollections、ブールshouldRefresh)で 5932:\ Work_Vol4 \ SVN \スタジオ\トランク\ work_area \ GridWF \ \ PivotAnalysis.Base \ SRC \エンジン\ PivotEngineエンジニア。 cs:line 2735 at のSyncfusion.PivotAnalysis.Base.PivotEngine.ResumeComputations(ブール resetPivotCollections)d:\ Work_Vol4 \ svn \ studio \ trunk \ work_area \ GridWF \ Engineer \ PivotAnalysis.Base \ Src \ Engine \ PivotEngine.cs:のSyncfusion.PivotAnalysis.Base.PivotEngine.Populate()の2718行d:\ Work_Vol4 \ svn \ studio \ trunk \ work_area \ GridWF \エンジニア\ PivotAnalysis.Base \ SRC \エンジン\ PivotEngine.cs:ライン 2829あなたは、このような繰り返しを避けるために持っている Syncfusion.Windows.Forms.PivotAnalysis.PivotGridControlBase.Populate(PivotEngine PE、

でこの例外を停止する再帰呼び出し。

関連する問題