0

阅读这些BackgroundWorker 与 ThreadPool 与 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 所说,权衡取舍,您需要手动创建(和删除)事件处理程序。

因为BackgroundWorker你有两个主要事件,DoWorkRunWorkerCompleted。此外,如果您想报告进度,您需要启用报告 ( bg.WorkerReportsProgress = true;) 并为此添加处理程序 ( ProgressChanged)。

In any case, you also need to handle workers that hasn't finished.

于 2012-10-24T16:33:30.437 回答