如何在线程中添加处理程序?
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
,因此它可以访问当前实例的成员。
我正在 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
,因此它可以访问当前实例的成员。