首页 > 解决方案 > 如何启动 Backgroundworker ByRef

问题描述

我想为后台工作人员分配一个自定义名称,所以我创建了一个自定义类:

 Public Class NamedBKW
        Public BKW As BackgroundWorker
        Public Name As String
        Public Sub New(ByVal thisBKW As BackgroundWorker, ByVal thisName As String)
            BKW = thisBKW
            Name = thisName
        End Sub
    End Class

我有一个这些 NamedBKW 的列表,我想通过循环迭代来一次启动一个。该列表是在程序启动时构建的。

Friend Sub StartService()
[...]

BuildLists()

For x As Integer = 0 To ListOfBKWs.Count - 1
                StartThisThread(ListOfBKWs(x).BKW, ListOfBKWs(x).Name)
                Thread.Sleep(3000)
            Next
End Sub

Public Sub BuildLists()
[...]
 ' List of BKWs:
            ' Note that the order listed here will determine the order they are started.
            ListOfBKWs = New List(Of NamedBKW)
            ListOfBKWs.Add(New NamedBKW(ScheduleCheckerBKW, "ScheduleChecker"))
            ListOfBKWs.Add(New NamedBKW(BackupStage5BKW, "Stage 5"))
            ListOfBKWs.Add(New NamedBKW(BackupStage4BKW, "Stage 4"))
            ListOfBKWs.Add(New NamedBKW(BackupStage3BKW, "Stage 3"))
            ListOfBKWs.Add(New NamedBKW(BackupStage2BKW, "Stage 2"))
            ListOfBKWs.Add(New NamedBKW(BackupStage1BKW, "Stage 1"))
            ListOfBKWs.Add(New NamedBKW(DeleteOldFilesBKW, "DeleteOldFiles"))
            ListOfBKWs.Add(New NamedBKW(FixerBKW, "Fixer"))
            ListOfBKWs.Add(New NamedBKW(ThreadCheckerBKW, "ThreadChecker"))
End Sub

Public Sub StartThisThread(ByRef thisBKW As BackgroundWorker, ByVal thisName As String)
            NPC.WriteToConsoleAndLog("MAIN: Starting " & thisName & " thread...")
            thisBKW = New BackgroundWorker
            thisBKW.WorkerReportsProgress = True
            thisBKW.WorkerSupportsCancellation = True
            thisBKW.RunWorkerAsync()
End Sub

但由于某种原因,这不起作用。控制台/日志打印它正在启动每个线程的消息,但线程实际上并没有启动。我究竟做错了什么?

所有的 Backgroundworkers 都在主类中声明,如下所示:

Friend WithEvents BackupStage1BKW As New BackgroundWorker

标签: vb.netbackgroundworkerbyref

解决方案


你有这样的声明来创建后台工作对象:

Friend WithEvents BackupStage1BKW As New BackgroundWorker

但是,您所显示的内容中没有任何内容表明这些工人实际上做了任何事情。如果有一个方法来处理DoWork作为声明的一部分连接的每个工人的事件WithEvents,我们看不到它。

我暂时假设这些方法确实存在并且正确订阅了这些事件。在这种情况下,我们进入下一个问题。这一行覆盖了声明的对象:

 thisBKW = New BackgroundWorker

您现在拥有全新的对象,并且之前存在的任何事件处理程序都不再适用。

你真的不想要那条线,你也不想要 ByRef这里。请记住,ByVal 仍然传递引用!唯一的区别是它传递了引用的副本,事实证明这正是您大部分时间所需要的。


推荐阅读