如何在VB.net中动态创建后台工作程序

时间:2011-06-16 18:46:59

标签: vb.net backgroundworker

我有一个VB.net项目,它使用后台工作程序来做一些事情。

现在我想扩展项目以便能够做多个事情:)

用户可以在文本框中输入URL,当用户点击解析按钮时,程序会创建一个新的tabcontrol,输出一些数据。

我为此使用了一个硬编码的后台工作者。

但现在我想运行多个后台工作人员来完成这些工作,所以我不能依赖硬编码后台工作人员。

是否可以动态创建后台工作程序。

我只是不知道如何设置它,因为我认为我需要设置不同的方法和变量,如:

Private bw As BackgroundWorker = New BackgroundWorker
bw.WorkerReportsProgress = True
bw.WorkerSupportsCancellation = True
AddHandler bw.DoWork, AddressOf bw_DoWork
AddHandler bw.ProgressChanged, AddressOf bw_ProgressChanged
AddHandler bw.RunWorkerCompleted, AddressOf bw_RunWorkerCompleted
bw.RunWorkerAsync()

Private Sub bw_DoWork()Private Sub bw_RunWorkerCompleted()Private Sub bw_ProgressChanged()

我想我需要在变量(list / dictionary)之类的某种数组中声明后台工作者?除此之外,我不知道如何解决这个问题。

3 个答案:

答案 0 :(得分:10)

以下是

Public Class Form
    Private Workers() As BackgroundWorker
    Private NumWorkers = 0

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        NumWorkers = NumWorkers + 1
        ReDim Workers(NumWorkers)
        Workers(NumWorkers) = New BackgroundWorker
        Workers(NumWorkers).WorkerReportsProgress = True
        Workers(NumWorkers).WorkerSupportsCancellation = True
        AddHandler Workers(NumWorkers).DoWork, AddressOf WorkerDoWork
        AddHandler Workers(NumWorkers).ProgressChanged, AddressOf WorkerProgressChanged
        AddHandler Workers(NumWorkers).RunWorkerCompleted, AddressOf WorkerCompleted
        Workers(NumWorkers).RunWorkerAsync()
    End Sub

End Class

然后是处理程序

Private Sub WorkerDoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs)
    ' Do some work
End Sub

Private Sub WorkerProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs)
    ' I did something!
End Sub

Private Sub WorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs)
    ' I'm done!
End Sub

想象一下多线程可能很容易。除非你有1000名工人,否则这很有效。每个处理程序中的 sender 参数可用于检查哪个工作程序报告进度等。

答案 1 :(得分:6)

尽管BackgroundWorkers可以是多线程有时的最佳,最简单和最智能的方式,但我认为您现在可能会尝试使用其他方式进行多线程。

关于哪种方法在每种情况下最好使用,有很多争论/争论/拖钓,所以我给你的建议是快速查看以下文章并自己决定(或者你可以'找到足够的资源来做出决定,当然可以问问。)

你显然已经看过地面工作人员,所以我不会列出它们,我也不会列出所有你可以解决的方式,只有你可能感兴趣的几个。

首先,请查看ThreadPool。它易于使用,并且可以很好地利用回收/再利用资源。有一些缺点,例如使用/保持池中的太多线程可以发掘池,但在简单应用程序中应该不是问题。

还有一个CLR Async model支持跨越庞大的框架本身,特别是在涉及某种形式的IO资源(文件,网络等)的情况下。

另一种方法是Parallel Class这是我最喜欢的方法之一 - 自从它被引入以来,我一直迷上多线lambda并且并行提供了一个很好的平台。

在上述所有情况中,您可以动态创建第三线程,而无需自己创建和维护后台工作池。很难说从所提供的信息中哪种方法最适合您,但就个人而言,如果检索填充标签的数据并不需要太长时间,我会考虑线程池。

希望有所帮助!

答案 2 :(得分:1)

如果我理解你的问题,请尝试在课程级别声明BackgroundWorker

Friend WithEvents bgw1 As BackgroundWorker

然后在类构造函数中实例化它。

Public Sub New()
  bgw1 = New BackgroundWorker
End Sub

在班级声明中,选择bgw1及其活动下拉列表部分,选择DoWorkProgressChangedRunWorkerCompleted活动。