我有一个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
)之类的某种数组中声明后台工作者?除此之外,我不知道如何解决这个问题。
答案 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
及其活动下拉列表部分,选择DoWork
,ProgressChanged
和RunWorkerCompleted
活动。