在vb.net中调用Backgroundworker中的函数?

在vb.net中调用Backgroundworker中的函数?,vb.net,multithreading,backgroundworker,Vb.net,Multithreading,Backgroundworker,我正试着和一个背景工作人员一起运行压缩,它运行得很好。 Compressor SDK为我提供了一个调用状态回调的函数,该函数也可以正常工作,但没有backgroundworker。当我尝试调用backgroundworker内部的函数时,backgroundworker告诉我它只能作为一个线程运行,然后进程被取消 如何在BW中调用此函数 我试图在backgroundworker中调用的函数: Public Function SqxCallback(ByVal pParam As IntPtr,

我正试着和一个背景工作人员一起运行压缩,它运行得很好。 Compressor SDK为我提供了一个调用状态回调的函数,该函数也可以正常工作,但没有backgroundworker。当我尝试调用backgroundworker内部的函数时,backgroundworker告诉我它只能作为一个线程运行,然后进程被取消

如何在BW中调用此函数

我试图在backgroundworker中调用的函数:

Public Function SqxCallback(ByVal pParam As IntPtr, ByRef CallbackInfo As SQX_CALLBACKINFO) As Integer

    If CallbackInfo.pszSourceFileName IsNot Nothing Then
        Me.lblStatusMsg.Text = " compressing... " & CallbackInfo.pszSourceFileName
        Me.lblStatusMsg.Refresh()
    End If


    Me.ProgressSingle.Value = CallbackInfo.iProgress

    Return 1

End Function
作为后台工作人员的私人BGWorker
BGWorker=新的BackgroundWorker()
BGWorker.WorkerReportsProgress=True
BGWorker.WorkerSupportsScanCellation=True
AddHandler BGWorker.ProgressChanged,New ProgressChangedEventHandler(BGWorker\u ProgressChanged的地址)
私有子BGWorker_ProgressChanged(ByVal发送方作为对象,ByVal e作为ProgressChangedEventArgs)
尝试
如果e.UserState.ToString为“”,则
Me.lblStatusMsg.Text=e.UserState.ToString
Me.lblStatusMsg.Refresh()
如果结束
Me.ProgressSingle.Value=e.ProgressPercentage
特例
“我们不在乎
结束尝试
端接头
作为整数的公共函数SqxCallback(ByVal pParam作为IntPtr,ByRef CallbackInfo作为SQX_CallbackInfo)
将消息设置为字符串=“”
如果CallbackInfo.pszSourceFileName不是空的,那么
message=“compressing…”&CallbackInfo.pszSourceFileName
如果结束
BGWorker.ReportProgress(CallbackInfo.iProgress,消息和“…”)
返回1
端函数

的可能重复,这里有一些问题,但是一个会让您感到困惑的问题是尝试更改
Me.lblStatusMsg
上的文本,因为您不能在后台工作程序中执行此操作,除非使用委托,并且需要调用控件等等。。。另外,与其将
CallbackInfo
传递给函数,不如在发送前检查
pszSourceFileName
:您可以传递一个布尔值并在函数中检查该布尔值。此外,除了设置进度条的值外,您没有对该对象执行任何操作。您可以在函数运行后设置。。。只有几件事需要考虑
Private BGWorker As BackgroundWorker

BGWorker = New BackgroundWorker()
BGWorker.WorkerReportsProgress = True
BGWorker.WorkerSupportsCancellation = True

AddHandler BGWorker.ProgressChanged, New ProgressChangedEventHandler(AddressOf BGWorker_ProgressChanged)


Private Sub BGWorker_ProgressChanged(ByVal sender As Object, ByVal e As ProgressChangedEventArgs)

    Try
        If e.UserState.ToString <> "" Then
            Me.lblStatusMsg.Text = e.UserState.ToString
            Me.lblStatusMsg.Refresh()
        End If

        Me.ProgressSingle.Value = e.ProgressPercentage

    Catch ex As Exception
        'We don't care
    End Try

End Sub

Public Function SqxCallback(ByVal pParam As IntPtr, ByRef CallbackInfo As SQX_CALLBACKINFO) As Integer
    Dim message as String = ""
    If CallbackInfo.pszSourceFileName IsNot Nothing Then
        message = " compressing... " & CallbackInfo.pszSourceFileName
    End If

    BGWorker.ReportProgress(CallbackInfo.iProgress, Message & "...")

    Return 1

End Function