私のwinformsアプリには、オブジェクトを含むキューがあります。
Queue<MyObj> _queuedRows = new Queue<MyObj>();
オブジェクトごとに、時間のかかる仕事をするために別々のバックグラウンドワーカーを開始する必要があります。
private void DoAll(List<MyObj> lst)
{
foreach (MyObj o in lst)
{
_queuedRows.Enqueue(o);
}
while (_queuedRows.Any())
DoSingle();
}
private void DoSingle()
{
if (!isCancelPending())
{
if (_queuedRows.Any())
{
MyObj currentObj = _queuedRows.Dequeue();
InitBackgroundWorker(currentObj);
}
}
}
private void InitBackgroundWorker(MyObj currentObj)
{
BackgroundWorker _worker = new BackgroundWorker();
_worker.WorkerSupportsCancellation = true;
_worker.WorkerReportsProgress = true;
_worker.DoWork += new DoWorkEventHandler(worker_DoWork);
_worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
if (!_worker.IsBusy && currentObj != null)
_worker.RunWorkerAsync(currentObj);
}
私の問題は、RunWorkerAsyncの呼び出し後、実行がwhileの次の反復にジャンプすることです(これは、ワーカーが非同期を実行していて、次の反復が発生することを可能にするため、論理的です)。
私が実際に行う必要があるのは、バックグラウンドワーカーがジョブを完了するまでなんとかして待機するようにアプリに指示することです。その後、DoSingle()の呼び出しを続行して、次の反復を開始する必要があります。
_queuedRowsオブジェクトまたは同様のものにロックを適用する必要がありますか?ありがとう、