我有一个相当复杂的窗口窗体应用程序,它正在管理2个后台工作线程。一切都按预期进行,但我发现自己写了两次东西,每个后台工作人员一次,我不确定是否需要这样做。例如,我有一个Do_Work例程:
Do While ThisQueue.FIleList.Count > 0
..Do some work..
Call Worker1DoSomething(SomeVar)
..Do more work..
Loop
在第二个后台工作人员的Do_Work例程中,我有:
Do While ThisQueue.FileList.Count > 0
..Do some work..
Call Worker2DoSomething(SomeVar)
..Do more work..
Loop
我能让两个Do_Work例程都调用一个函数而不把事情搞砸吗?Worker1DoSomething(byval thisvar作为字符串(和Worker2DoSometing(byval this var作为字符串(没有两个函数,而是只有一个函数WorkerFunctionDoSometing(byval thisvar作为字符串?
我问这个问题的最大原因是,我有8个函数,实际上是从任一Do_Work例程调用的4个函数,这将大大简化代码。其中一个函数将数据写入SQL服务器,这也是我开始使用此方法的主要原因。
提前感谢您的帮助或建议!Fred
你当然可以做到。与任何事件处理程序一样,在DoWork
事件处理程序中,sender
参数是引发事件的对象。如果在每个BackgroundWorker
与要使用的数据和/或要执行的方法之间建立关系,则可以使用sender
获取该数据和(或(方法并加以利用。一种方法是使用以BackgroundWorker
对象为密钥的Dictionary
:
Private ReadOnly workMethodsByWorker As New Dictionary(Of BackgroundWorker, Action(Of Object)) From {{BackgroundWorker1, AddressOf Method1},
{BackgroundWorker2, AddressOf Method2}}
Private data As Object
Private Sub BackgroundWorkers_DoWork(sender As Object, e As DoWorkEventArgs) Handles BackgroundWorker1.DoWork,
BackgroundWorker2.DoWork
Dim worker = DirectCast(sender, BackgroundWorker)
Dim method = workMethodsByWorker(worker)
method(data)
End Sub
Private Sub Method1(data As Object)
'...
End Sub
Private Sub Method2(data As Object)
'...
End Sub
另一种选择是定义自己的类,该类继承BackgroundWorker
并为要执行的方法添加一个属性,并使用该类而不是标准的BackgroundWorker
:
Imports System.ComponentModel
Public Class BackgroundWorkerEx
Inherits BackgroundWorker
Public Property WorkMethod As Action(Of Object)
End Class
Private data As Object
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
BackgroundWorkerEx1.WorkMethod = AddressOf Method1
BackgroundWorkerEx2.WorkMethod = AddressOf Method2
End Sub
Private Sub BackgroundWorkers_DoWork(sender As Object, e As DoWorkEventArgs)
Dim worker = DirectCast(sender, BackgroundWorkerEx)
Dim method = worker.WorkMethod
method(data)
End Sub
Private Sub Method1(data As Object)
'...
End Sub
Private Sub Method2(data As Object)
'...
End Sub