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

时间:2017-12-01 11:17:14

标签: vb.net visual-studio loops listbox backgroundworker

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

我循环遍历每个目录路径并提取每条路径上设置的权限。

我最初把它作为一个函数,这样调用......

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

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

我将函数更改为后台工作程序并尝试异步调用它...

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

我用我的bgw抓住了dirpath论点......

 Dim path As String = CStr(e.Argument)

这是一种享受...应用程序不挂起,目录循环通过...问题是它只适用于列表框中的第一个路径。所有其余的都被跳过,因为后台工作人员很忙,无法处理。

是否有可能产生多个背景实例来完成工作,或者我应该以不同的方式接近它?

1 个答案:

答案 0 :(得分:4)

我强烈建议您查看.NET中的异步编程的TAP模式,该模式自.NET Framework 4.5以来就已存在。它使用Task类以及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)