后台工作人员是否可以共享功能



我有一个相当复杂的窗口窗体应用程序,它正在管理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

最新更新