如何在线程中添加处理程序?

How to add hander within a thread?

我正在 VB 中使用 Ionic Class 压缩文件。我想向 GUI 报告保存进度。我用 Sub ProgessChanged 处理了 zip.SaveProgress 事件。它在主线程上工作,但我需要将它转移到工作线程。

这是我绑的..

Dim foldertozip As String
Dim zipfileaddress As String

 Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SelectFile_BT.Click
      Dim th As Thread = New Thread(AddressOf ZipUp)
      th.Start()
 End Sub

Public Sub ZipUp()
    Dim zip As ZipFile = New ZipFile
    AddHandler zip.SaveProgress, AddressOf ProgressUpdater

    zip.CompressionLevel = Ionic.Zlib.CompressionLevel.BestSpeed
    zip.BufferSize = My.Settings.BufferSize
    zip.AddDirectory(foldertozip)
    zip.Save(zipfileaddress)
End Sub


Public Shared Sub ProgressUpdater(ByVal sender As Object, ByVal e As SaveProgressEventArgs)
    If (e.EventType = ZipProgressEventType.Saving_Completed) Then
        Return
    ElseIf (e.EventType = ZipProgressEventType.Saving_BeforeWriteEntry) Then
        Status.Label1.Text = e.CurrentEntry.FileName
    ElseIf (e.EventType = ZipProgressEventType.Saving_EntryBytesRead) Then
        Status.PercentLabel.Text = CStr(CInt(e.BytesTransferred) / (0.01 * e.TotalBytesToTransfer))
        Status.ProgressBar1.Value = CInt(CInt(e.BytesTransferred) / (0.01 * e.TotalBytesToTransfer))
    End If
End Sub

我对线程不太熟悉...

谢谢

您是想在辅助线程上执行压缩但在 UI 线程上处理事件,但实际上并没有这么说?如果是这样,那么您只需使用相同的 Invoke 方法在 UI 线程上执行事件处理程序,就像在任何时候您想要在 WinForms 中的 UI 线程上执行一个方法一样。无论如何,该事件都将在辅助线程上引发。

Public Sub ProgressUpdater(ByVal sender As Object, ByVal e As SaveProgressEventArgs)
    If Me.InvokeRequired Then
        Me.Invoke(New Action(Of Object, SaveProgressEventArgs)(AddressOf ProgressUpdater), sender, e)
    Else
        If (e.EventType = ZipProgressEventType.Saving_Completed) Then
            Return
        ElseIf (e.EventType = ZipProgressEventType.Saving_BeforeWriteEntry) Then
            Status.Label1.Text = e.CurrentEntry.FileName
        ElseIf (e.EventType = ZipProgressEventType.Saving_EntryBytesRead) Then
            Status.PercentLabel.Text = CStr(CInt(e.BytesTransferred) / (0.01 * e.TotalBytesToTransfer))
            Status.ProgressBar1.Value = CInt(CInt(e.BytesTransferred) / (0.01 * e.TotalBytesToTransfer))
        End If
    End If
End Sub

请注意,该方法不是 Shared,因此它可以访问当前实例的成员。