我可以 运行 我的后台工作者的多个实例吗?
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 以及 Async
和 Await
关键字使异步代码更易于阅读和维护。
然而,即使使用后台工作者,您仍然可以通过调用 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)
我有一个应用程序,其中包含一个充满目录路径的列表框。
我正在遍历每个目录路径并提取每个路径上设置的权限。
一开始我把它当作一个函数,这样调用...
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 以及 Async
和 Await
关键字使异步代码更易于阅读和维护。
然而,即使使用后台工作者,您仍然可以通过调用 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)