Vb.net 暂停并恢复线程(后台工作线程)

Vb.net 暂停并恢复线程(后台工作线程),vb.net,multithreading,Vb.net,Multithreading,我在VB.Net中工作,需要暂停一个线程,等待另一个线程完成 我看到了一个非常接近的问题,但似乎无法理解(并且无法对该帖子发表评论) 我的设想是,我有两个背景工人。Worker1正在将文件名传递给处理文件的Worker2。如果Worker2尚未完成,我需要暂停Worker1。即Worker1仅在Worker2完成后发布下一个文件名 有什么办法吗 @user1666788注释后的工作代码 下面的代码适用于上述两个后台工作人员的场景,其中一个必须等待另一个完成后才能继续 Dim isFinished

我在VB.Net中工作,需要暂停一个线程,等待另一个线程完成

我看到了一个非常接近的问题,但似乎无法理解(并且无法对该帖子发表评论)

我的设想是,我有两个背景工人。Worker1正在将文件名传递给处理文件的Worker2。如果Worker2尚未完成,我需要暂停Worker1。即Worker1仅在Worker2完成后发布下一个文件名

有什么办法吗

@user1666788注释后的工作代码

下面的代码适用于上述两个后台工作人员的场景,其中一个必须等待另一个完成后才能继续

Dim isFinished as boolean
Dim currentFiile as integer

Private Sub StartWork_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles StartWork.Click
    bgWorker1.WorkerSupportsCancellation = True
    isFinished = True
    currentFile = 0
    bgWorker1.RunWorkerAsync()
End Sub

Private Sub bgWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgWorker1.DoWork
    If isFinished = False Then
        bgWorker1.CancelAsync()
    End If
    isFinished = False
    For i = currentFile To fileNames.Count - 1
        Dim fileName As String = fileNames(i)
        LoadRules(myValidator.GetFileType(fileName))
        If i = fileNames.Count Then bgWorker1.CancelAsync()
        Exit Sub
    Next
End Sub

Private Function LoadRules(ByVal fileType As String) As Boolean
    ' Function to load some rules for file processing
    Try

        ' Start Thread for actual file processing using bgworker2
        bgWorker2.WorkerSupportsCancellation = True
        bgWorker2.RunWorkerAsync()
        Return True
    Catch ex As Exception

    End Try
End Function

Private Sub bgWorker2_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgWorker2.DoWork

    Try

         ' Do your thing here
         ' for x is 0 to 1million
         ' next

        ' Mark is finished to true
        isFinished = True

        ' Set currentFile
        currentFile += 1

        ' The bgWorker1 is restarted when bgWorker2 has finished.
        ' Note however that bgWorker1 will "Continue" where it left off due to the property "currentFile"
        bgWorker1.RunWorkerAsync()

        '++++++++++++++++++++++++++++++++++++
    Catch ex As Exception

    End Try
End Sub

好了。工作如期进行。现在需要弄清楚如何“监控”将文件写入磁盘的进度,以便在文件完全创建后启动另一个进程。…

我遇到了与此类似的问题。根据VS告诉我的,这是不可能的。 但是,我找到了一种方法来绕过暂停/恢复不再使用的线程的子例程

最简单的方法是检查进度,如果仍在工作,则结束通话。 这里有一个例子,假设S1是第一个线程,S2是第二个线程

sub S1()

if(processingfile)then exit sub

'Insert code here for sending next file for processing

end sub

sub S2()
processingfile = true

'Insert code for processing files

processingfile = false

end sub
这或多或少就是我解决这个问题的方法。我希望我的建议有帮助:)


哦,还有一件事,在检查文件是否正在处理之前,您可能想先休眠第一个线程,这样它就不会占用大量CPU资源。但这只是一个猜测,我没有尝试过短时间的睡眠,我有过类似的问题。根据VS告诉我的,这是不可能的。 但是,我找到了一种方法来绕过暂停/恢复不再使用的线程的子例程

最简单的方法是检查进度,如果仍在工作,则结束通话。 这里有一个例子,假设S1是第一个线程,S2是第二个线程

sub S1()

if(processingfile)then exit sub

'Insert code here for sending next file for processing

end sub

sub S2()
processingfile = true

'Insert code for processing files

processingfile = false

end sub
这或多或少就是我解决这个问题的方法。我希望我的建议有帮助:)


哦,还有一件事,在检查文件是否正在处理之前,您可能想先休眠第一个线程,这样它就不会占用大量CPU资源。但这只是一个猜测,我没有在没有短睡眠时间的情况下尝试过。

使用容量为1的BlockingCollection。@HansPassant我已经根据下面答案1中的建议“快速解决”了我的问题。然而,我在谷歌上搜索了BlockingCollection,它看起来可以以一种更“专业”的方式解决上述问题。您是否有示例实现或详细指南?请使用容量为1的BlockingCollection。@HansPassant我已根据下面答案1中的建议“快速解决”了我的问题。然而,我在谷歌上搜索了BlockingCollection,它看起来可以以一种更“专业”的方式解决上述问题。您是否有示例实现或详细指南?谢谢!它就像一个符咒。我将编辑我的帖子来显示我的代码。谢谢!它就像一个符咒。我将编辑我的帖子以显示我想出的代码。