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报告进度等.
尽管BackgroundWorkers 有时可能是最好,最简单,最智能的多线程方式,但我认为您现在可能会尝试使用其他方式来实现多线程.
关于哪种方法在每种情况下最好使用,有很多辩论/争论/拖钓,所以我对你的建议是快速浏览以下文章并自己决定(或者如果你找不到好的话)足够的资源来做出决定,当然要问问题.
你显然已经看过地面工作人员,所以我不会列出它们,也不会列出你可以解决的所有方法,只有你可能感兴趣的一对.
首先,查看ThreadPool.它易于使用,并且可以很好地利用回收/再利用资源.有一些缺点,例如使用/保持池中的太多线程可以放出池,但在简单的应用程序中应该不是问题.
还有一个CLR异步模型,它支持跨越庞大的框架本身,特别是在涉及某种形式的IO资源(文件,网络等)的情况下.
另一种方法是Parallel Class,这是我的最爱之一 - 我已经被引入多线lambda,因为它被引入并且并行提供了一个很好的平台.
在上述所有情况中,您可以动态创建第三线程,而无需自己创建和维护后台工作池.从提供的信息中很难说哪种方法最适合您,但就个人而言,如果检索填充选项卡的数据并不需要太长时间,我会考虑线程池.
希望有所帮助!