backgroundworker或线程池

时间:2010-05-07 15:21:53

标签: .net vb.net multithreading

我正在尝试创建一个允许多个搜索请求发生的应用,同时保持使用用户界面以允许交互。对于多个搜索请求,我最初只有一个搜索请求运行,用户交互仍然可以通过使用后台工作程序来执行此操作。现在我需要通过允许更多搜索功能来扩展这些功能,并且基本上只是将它们排队。我不确定是否使用多个后台工作者或使用线程池,因为我希望能够随时了解每个搜索工作的进度。

如果我正在使用线程池,我会做的就是在每次发出搜索请求时调用的循环中添加它

 ThreadPool.QueueUserWorkItem(AddressOf Search)

但是如果使用backgroundworkers,这是我知道怎么做的唯一方法,我不知道如何将这些添加到任何东西,但也许是一个arraylist,我可以从每个bgw调用reportprogress。

编辑:

所以例如这是我当前的代码

 For Each Thread In ThreadList
                    'Thread.Sleep(500)
                    SyncLock Me

                        If searchChoice = "google" Or fromUrl.Contains("google") Then
                            links = parsingUtilities.GetGoogleLinksFromHtml(fromUrl, html, searchItem)
                            posts = parsingUtilities.GetPostLinksFromHtml(links)
                            If links.Count = 0 Then
                                Exit Sub
                            End If
                            Exit For
           .....

所以在上面的代码链接和帖子是arraylists我用来获取我需要的网址,他们用于不同的搜索选项,我最初在链接和帖子上有synclock,但有人告诉我使用synclock我而不是。因此,从您的观点来看,我应该为每个搜索控件分配一个单独的数据控件,并在足够的时间之后锁定相应的数据控件并将其传输以进行写入。 感谢

4 个答案:

答案 0 :(得分:1)

我一般只留下线程池。它是一个流程范围的资源,可以配置为具有不同的大小,尤其是在webapps中。但是,由于您的应用程序听起来像是客户端表单应用程序,因此您不会与任何其他应用程序共享线程池,您可以根据需要对其进行配置。

您的用例比大多数用户更适合线程池,但这样做并没有太大的优势。

答案 1 :(得分:1)

您仍然可以使用BackgroundWorkers获取进度更新,因此我没有理由停止使用它们。

BackgroundWorker本身使用线程池来回收线程AFAIK。所以你可能仍然可以限制池的大小并继续使用BW。

答案 2 :(得分:1)

您可以像使用BackgroundWorker一样使用ThreadPool。

唯一的区别是,使用ThreadPool,您需要使用Dispatcher.Invoke或Control.Invoke将您的进度和完成事件编组回自己的UI线程。但是,ThreadPool可以让您轻松排队并运行任意数量的任务。

答案 3 :(得分:1)

我认为您应该使用线程池,因为根据您编写的内容,您将有更多线程由后台线程生成。

在这样的设计中,我看到系统被数千个线程重载。线程池更易于管理,因为您有一个地方可以设置线程限制。有些工作可能需要等待才能完成工作,但这比重载整个系统要好。

更新:
我不知道这一点,但似乎BackgroundWorker使用ThreadPool,因此您不会有爆炸线程数量的危险。我看到用数千个线程爆炸的系统是用C ++编写的。