2012-09-18 166 views
1

我在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 

你走了。它按預期工作。現在需要弄清楚如何「監視」文件寫入磁盤的進度,這樣我就可以在文件完全創建後開始另一個進程.....

+0

請向我們顯示您的代碼。 –

+1

使用有限容量爲1的BlockingCollection。 –

+0

@HansPassant根據以下答案中的建議,我已經「快速解決」了我的問題。不過,我已經谷歌搜索BlockingCollection,它看起來像它會以更專業的方式解決上述問題。你有樣本實施還是詳細指南? – lukik

回答

1

我有類似的問題。從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電源。但這只是一個猜測,我沒有嘗試沒有很短的睡眠時間

+0

謝謝!它像一個魅力。我將編輯我的帖子以顯示我提出的代碼。 – lukik