我可以 运行 我的后台工作者的多个实例吗?

Can i run multiple instances of my background worker?

我有一个应用程序,其中包含一个充满目录路径的列表框。

我正在遍历每个目录路径并提取每个路径上设置的权限。

一开始我把它当作一个函数,这样调用...

 For Each dirpath In ListBox3.Items
     CalculatePermissions(dirpath)
 Next

这行得通,但是我的应用程序当然会在工作进行期间挂起并长时间无响应。我正在递归地查看所有目录和子目录,因此可能会有很多结果。

我将函数更改为 backgroundworker 并尝试像这样异步调用它...

 For Each dirpath In ListBox3.Items
     bgw_CalcPermissions(dirpath)
 Next

我用这个在我的 bgw 中获取了 dirpath 参数...

 Dim path As String = CStr(e.Argument)

这很有用...应用程序不会挂起并且目录会循环...问题是它仅适用于列表框中的第一个路径。其余的全部跳过,因为backgroundworker忙,无法处理。

是否可以生成多个后台实例来执行这项工作,或者我应该以不同的方式处理这个问题?

我强烈建议您查看 .NET 中用于异步编程的 TAP 模式,该模式自 .NET Framework 4.5 以来一直存在。它使用 Task class 以及 AsyncAwait 关键字使异步代码更易于阅读和维护。

然而,即使使用后台工作者,您仍然可以通过调用 Parallel.ForEach 方法轻松地完成此操作。为此,您首先需要对其进行更改,以便将完整的项目列表发送给后台工作人员,而不是单个项目:

Dim paths As IEnumerable(Of String) = ListBox1.Items.OfType(Of String).ToArray()
bgw_CalcPermissions(paths)

然后,在后台工作者事件处理程序中,您可以这样调用Parallel.ForEach

Dim paths As IEnumerable(Of String) = DirectCast(e.Argument, IEnumerable(Of String))
Parallel.ForEach(paths, AddressOf CalcPermissions)