0

これらのBackgroundWorker vs. ThreadPool vs. Threadのヒントを読んで、私はBackgroundWorkerを使用することにしました。

ツールボックスからフォームにコンポーネントをドラッグ アンド ドロップすることで、このようなスレッドを作成する方法は知っていますが、複数のスレッド (10 ~ 20 の間の有限数) が必要なため、どのようにアプローチすればよいかわかりません。これは:

  • そのうちの 10 ~ 20 個をドラッグ アンド ドロップして、コード内にそれらのプレースホルダーを作成しますが、アプリケーションのニーズに応じて、実行する必要があるものだけを開始します (さまざまなシナリオで、これらの 10 ~ 20 個のスレッドのうち 1 ~ 2 個を実行できます)。 .

また

私はドラッグ アンド ドロップのアプローチを好みますが、BackgroundWorker の経験がなく、トレードオフがどうなるかわかりません。

経験豊富な BackgroundWorker プログラマーからのヒントはありますか?

4

1 に答える 1

1

それらを保持する配列を作成できます。それぞれにハンドラーを追加します。完了したら、配列を調べてそれらを破棄します。例 (申し訳ありませんが、これは VB コードから翻訳されたものです。私は C# の専門家ではないため、最悪の場合は疑似コードと見なしてください):

//globally
List<BackgroundWorker> workers = new List<BackgroundWorker>();

//within a sub/function
int numberOfWorkersNeeded = 10;
for (i = 0; i < numberOfWorkersNeeded; i++) {
    BackgroundWorker bg = new BackgroundWorker();
    bg.DoWork += new DoWorkEventHandler(MyWorkHandler);
    bg.RunWorkerCompleted += new RunWorkerCompletedEventHandler(MyWorkFinishedHandler);
    workers.Add(bg);
}

削除するには (これらは再利用可能であるため、これは終了時またはワーカーが不要になった場合に使用します):

for (i = 0; i < workers.Count; i++) {
    if (!bg.IsBusy) {
        //remove handlers
        workers(i).Dispose();
    }
}

トレードオフは @ateiop が述べたとおりです。イベント ハンドラーを手動で作成 (および削除) する必要があります。

あなたにはBackgroundWorker2 つの主要なイベントがDoWorkありRunWorkerCompletedます。さらに、進行状況を報告したい場合は、報告を有効にし ( bg.WorkerReportsProgress = true;)、そのためのハンドラーも追加する必要があります ( ProgressChanged)。

いずれにせよ、終了していないワーカーも処理する必要があります。

于 2012-10-24T16:33:30.437 に答える