我正在尝试创建一个允许多个搜索请求发生的应用,同时保持使用用户界面以允许交互。对于多个搜索请求,我最初只有一个搜索请求运行,用户交互仍然可以通过使用后台工作程序来执行此操作。现在我需要通过允许更多搜索功能来扩展这些功能,并且基本上只是将它们排队。我不确定是否使用多个后台工作者或使用线程池,因为我希望能够随时了解每个搜索工作的进度。
如果我正在使用线程池,我会做的就是在每次发出搜索请求时调用的循环中添加它
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我而不是。因此,从您的观点来看,我应该为每个搜索控件分配一个单独的数据控件,并在足够的时间之后锁定相应的数据控件并将其传输以进行写入。 感谢
答案 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 ++编写的。