我正在尝试创建一个应用程序,该应用程序允许发生多个搜索请求,同时保持使用用户界面以允许交互。对于多个搜索请求,我最初只运行一个搜索请求,但用户交互仍然可以通过使用后台工作人员来执行此操作。现在我需要通过允许更多搜索功能来扩展这些功能,并且基本上只是将它们排队。我不确定是使用多个后台 worker 还是使用线程池,因为我希望能够随时了解每个搜索作业的进度。
如果我使用线程池,我要做的就是将其添加到循环中,每次发出搜索请求时都会调用该循环
ThreadPool.QueueUserWorkItem(AddressOf Search)
但是如果使用backgroundworkers,这是我知道的唯一方法,而且我不知道如何将它们添加到任何东西,但也许是一个数组列表,我可以从每个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
.....
所以在上面的代码中,链接和帖子是我用来获取我需要的网址的数组列表,它们用于不同的搜索选择,我最初在链接和帖子上有同步锁,但其他人告诉我改用同步锁。因此,从您的角度来看,我应该为每个搜索控件分配一个单独的数据控件,并在足够的时间后锁定适当的数据控件并将其传输以进行写入。 谢谢
最佳答案
我通常不理会线程池。它是一个进程范围的资源,可以配置为不同的大小,尤其是在 Web 应用程序中。但是,由于您的应用程序听起来像客户端表单应用程序,因此您不会与任何其他应用程序共享线程池,并且您可以根据需要对其进行配置。
您的用例比大多数用例更适合线程池,但这样做并没有太大的优势。
关于.net - 后台 worker 或线程池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2789655/