私はWinFormsアプリケーションを書いています。データベースからデータを取得し、そのデータ セットに対していくつかのアクションを実行してから、データベースに保存する予定です。データベース内の 1 つのテーブルのみに関心があるため、LINQ to SQL を使用してデータベースへのクエリを実行しているため、このために ORM 全体を実装したくありませんでした。
DBからデータセットを取得しています。ただし、データセットはかなり大きいです。したがって、現在私がやろうとしているのは、データセットを 4 つの比較的等しいサイズのリスト ( List<object>
) に分割することです。
次に、これらのリストのそれぞれを実行し、アクションを実行し、その間にその進行状況を報告する別のバックグラウンド ワーカーを用意します。4 つのバックグラウンド ワーカーすべてがセクションの処理を完了したら、これらのセクションを 1 つの大きなリストに統合する予定です。
しかし、バックグラウンド ワーカーが一意のリストを処理している間、エラーが発生し続けます。List オブジェクトに変換された場合でも、オブジェクトは LINQ to SQL の DataContext との関係を維持していますか? これを修正する方法はありますか?私はマルチスレッドの経験がほとんどないので、これが完全に間違っている場合は教えてください。
みんなありがとう。コード スニペットやその他の情報が必要な場合は、お問い合わせください。
編集:おっと。エラーメッセージを出すのをすっかり忘れていました。DataContext designer.cs ではAn item with the same key has already been added.
、SendPropertyChanging
関数でエラーが発生します。
private void Setup(){
List<MyObject> quarter1 = _listFromDB.Take(5000).ToList();
bgw1.RunWorkerAsync();
}
private void bgw1_DoWork(object sender, DoWorkEventArgs e){
e.Result = functionToExecute(bgw1, quarter1);
}
private List<MyObject> functionToExecute(BackgroundWorker caller, List<MyObject> myList)
{
int progress = 0;
foreach (MyObject obj in myList)
{
string newString1 = createString();
obj.strText = newString;
//report progress here
caller.ReportProgress(progress++);
}
return myList;
}
この同じ関数が 4 つのワーカーすべてによって呼び出され、関数と呼ばれるワーカーに基づいて myList の異なるリストが与えられます。