我在VB.Net工作,我需要暫停一個線程,因爲它等待另一個完成。暫停和恢復一個線程(後臺工作者)
我已經看到了非常密切的問題,但似乎無法推測出來(而不能對後Pause/Resume loop in Background worker評論)
我的情況是,我有2周背景的工人。 Worker1將fileNames傳遞給處理文件的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
你走了。它按預期工作。現在需要弄清楚如何「監視」文件寫入磁盤的進度,這樣我就可以在文件完全創建後開始另一個進程.....
請向我們顯示您的代碼。 –
使用有限容量爲1的BlockingCollection。 –
@HansPassant根據以下答案中的建議,我已經「快速解決」了我的問題。不過,我已經谷歌搜索BlockingCollection,它看起來像它會以更專業的方式解決上述問題。你有樣本實施還是詳細指南? – lukik