2

私の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オブジェクトまたは同様のものにロックを適用する必要がありますか?ありがとう、

4

2 に答える 2

4

DoSinglewhileループで呼び出す代わりに、それをDoSingle1回呼び出すように変更してから、バックグラウンドワーカーのRunWorkerCompletedイベントハンドラーDoSingleで、キューが完了するまで何度も呼び出します。

    private void DoAll(List<MyObj> lst)
    {
        foreach (MyObj o in lst)
        {
            _queuedRows.Enqueue(o);
        }

        if (_queuedRows.Any())
            DoSingle();
    }

また、キュー内のすべてのオブジェクトを並行して処理しているわけではないため、バックグラウンドワーカーを一度だけインスタンス化して再利用します。

于 2012-06-21T20:11:31.023 に答える
0

バックグラウンドワーカーは1人だけ使用する必要があります。

于 2012-06-21T20:13:36.413 に答える