【问题标题】:How to add hander within a thread?如何在线程中添加处理程序?
【发布时间】:2016-04-07 09:33:47
【问题描述】:

我正在使用 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

我对线程不太熟悉...

谢谢

【问题讨论】:

    标签: vb.net multithreading zipfile


    【解决方案1】:

    您是说,但实际上没有说,您想在辅助线程上进行压缩,但在 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,所以它可以访问当前实例的成员。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-06
      • 1970-01-01
      • 1970-01-01
      • 2012-04-15
      • 1970-01-01
      相关资源
      最近更新 更多