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

Pee*_*Haa 0 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()
Run Code Online (Sandbox Code Playgroud)

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

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

Pål*_*gbø 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
Run Code Online (Sandbox Code Playgroud)

然后是处理程序

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
Run Code Online (Sandbox Code Playgroud)

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


Smu*_*202 6

尽管BackgroundWorkers 有时可能是最好,最简单,最智能的多线程方式,但我认为您现在可能会尝试使用其他方式来实现多线程.

关于哪种方法在每种情况下最好使用,有很多辩论/争论/拖钓,所以我对你的建议是快速浏览以下文章并自己决定(或者如果你找不到好的话)足够的资源来做出决定,当然要问问题.

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

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

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

另一种方法是Parallel Class,这是我的最爱之一 - 我已经被引入多线lambda,因为它被引入并且并行提供了一个很好的平台.

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

希望有所帮助!