大量のデータを処理してUIを更新しようとしている次のコードがあります。バックグラウンドワーカーを使用して同じことを試しましたが、同様の問題が発生します。問題は、新しいスレッドでインスタンス化されていないクラスを使用しようとしているようです(実際のエラーは、現在のスレッドがインスタンスを所有していないということです)。私の質問は、このエラーを回避するためにスレッド間でこのインスタンスを渡すことができる方法はありますか?スレッド間でデータを渡す
DataInterfaceClass dataInterfaceClass = new DataInterfaceClass();
private void OutputData(List<MyResult> Data)
{
progressBar1.Maximum = Data.Count;
progressBar1.Minimum = 1;
progressBar1.Value = 1;
foreach (MyResult res in Data)
{
// Add data to listview
UpdateStatus("Processing", res.Name);
foreach (KeyValuePair<int, string> dets in res.Details)
{
ThreadPool.QueueUserWorkItem((o) =>
{
// Get large amount of data from DB based on key
// – gives error because DataInterfaceClass was
// created in different thread.
MyResult tmpResult = dataInterfaceClass
.GetInfo(dets.DataKey);
if (tmpResult == null)
{
// Updates listview
UpdateStatus("Could not get details",
dets.DataKey);
}
else
{
UpdateStatus("Got Details", dets.DataKey);
}
progressBar1.Dispatcher.BeginInvoke(
(Action)(() => progressBar1.Value++));
});
}
}
}
EDIT:
DataInterfaceClassが実際definated、それが中に使用される関数の外部で作成、それはインスタンスと静的ではありません。
DataInterfaceClassが静的であるように見えるので、質問を更新しました。同時タスクの数は、実行するUIのプロセスを更新するだけです(データの同時アクセスは想定していません)。 –
@ pm_2:同時にアクセスする必要がない場合は、ネストされたループ内の作業項目をキューに入れるのではなく、両方の 'foreach'ループを単一の作業項目に入れる必要があります。 – Thorarin