gpt4 book ai didi

vb.net - 使用参数化函数(x,y,z)的for循环中的多个线程

转载 作者:行者123 更新时间:2023-12-03 12:55:34 24 4
gpt4 key购买 nike

我有一个包含文件夹 ID 和文件夹路径的列表。我想将其中一些文件夹传递给压缩它们的函数。我想要的是让三个线程并行运行并一次压缩三个不同的路径。现在发生的是每个线程等待下一个线程完成以处理下一个线程。有任何想法吗?

Dim SelectedRange = From folders In listFolders Where folders.FolderID >= 150101

For Each item In SelectedRange
Dim t As New Thread(
Sub()
Me.BeginInvoke(DirectCast(Sub() ZipFolder(sInclearDestination, item.FolderID.ToString, item.FolderPath), MethodInvoker))
End Sub)
t.Start()
t.Join()
Next
Public Function ZipFolder(ByVal sFolderPathDestination As String, ByVal folderID As String, ByVal folderPath As String) As Boolean
Try
Using zip = New Ionic.Zip.ZipFile()
'If the zip file does not exist then get the folder and zip it to the destination
If Not File.Exists(Path.Combine(sFolderPathDestination, folderID & ".zip")) Then
zip.AddDirectory(folderPath)
zip.Save(Path.Combine(sFolderPathDestination, CType(folderID, String) & ".zip"))
Return True
Else
Logging.Log("Aborting zipping: " & Path.Combine(sFolderPathDestination, folderID & ".zip") & ". The zip file already exists!")
Return False
End If
End Using
Catch ex As Exception
Logging.Log("Error in zipping: " & Path.Combine(sFolderPathDestination, folderID & ".zip") & " Error: " & ex.Message)
Return False
End Try
End Function

最佳答案

您的代码有两个问题。

第一个问题是对 Me.BeginInvoke 的调用。 .假设您正在创建一个 WinForm 应用程序和 Me是对当前 Form 的引用. Form.BeginInvoke (从基类 Control 继承)使给定的委托(delegate)在 UI 线程上执行。因此,您所做的只是创建三个单独的线程,它们都会立即调用回 UI 线程来完成所有工作。您显然不能这样做并且仍然期望并行处理任务。您需要删除对 BeginInvoke 的调用.如果您需要调用BeginInvoke为了更新表单上某些数据的显示,您需要尽可能晚地执行此操作,并在该 UI 调用的代码中做尽可能少的工作,以便大部分工作仍在工作人员中完成线程。

第二个问题是对 Thread.Join 的调用。 .您调用Join在您的For 内启动线程后立即循环。这意味着它会坐在那里等待,在对 Join 的调用中。 , 直到工作线程完成。因此,您的循环在开始下一个线程之前等待每个线程完成,实质上使其成为单线程。您应该删除对 Join 的调用。 .如果需要调用方法等待所有线程完成,就等待调用Join在线程上,直到所有线程都已启动(即在 For 循环之后)。

关于vb.net - 使用参数化函数(x,y,z)的for循环中的多个线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28199662/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com