2013-07-24 16 views
4

我試圖在應用程序中實現多線程。應用程序需要創建可變數量的線程,同時傳遞變量。我可以很容易地創建線程,但是我試圖找出一種能夠立即停止所有線程的方法,並且如果在這些線程中的任何一個線程中發現錯誤,請停止所有線程。如果在其中一箇中檢測到錯誤,則停止所有線程

我目前的解決方案是將函數封裝在循環中,檢查布爾值是否爲「真」,在這種情況下線程繼續執行。如果有錯誤,我將該值更改爲「False」,並停止所有線程。同樣,如果我想手動停止線程,我可以從函數中將值設置爲「false」。

有沒有更好的解決方案,因爲主要問題是線程必須在完全停止之前到達循環的結尾?

+0

當你說「錯誤被捕獲」時,你的意思是它會在線程中拋出一個異常,或者你的代碼只是檢測到某種錯誤? –

+0

兩者 - 他們在嘗試catch塊以及我自己的東西來檢查錯誤 – Matt

+1

有沒有解決方案,使這更容易。除了實際工作的解決方案之外,如果您不聲明它是volatile的,那麼在VB.NET中,Boolean不是線程安全的。改爲關注Task和CancellationToken。而且,無論何時進行穿線,首先要做一件*工作。它使用得越多,指數越難。 –

回答

2

在一段時間內運行線程True塊應該沒問題。一旦它的錯誤,你可以迭代線程並調用thread.abort(),即使有時使用abort並不是一個好主意。使用線程列表可能會有所幫助。我不知道你是如何創建你的線程,但這應該很容易理解。

Dim listThreads As List(Of Threading.Thread) 
'create/instantiate your threads adding them to the collection something like the following 
For i = 1 To numberofthreadsyouneed 
    Dim tempThread As Threading.Thread = New Threading.Thread 
    tempThread.Start() 
    tempThread.Add(tempThread) 
next 

取而代之的是使用while塊來做一個Try catch。內抓遍歷列表中止線程

Catch ex As Exception 
    For each Thread in listThreads 
     Thread.Abort() 
    Next 
end Try 
+0

如何提供更多的細節?也許是簡單的代碼示例? –

+0

如果線程中止並不總是一個好主意,你能建議一個替代方案嗎?謝謝 – Matt

+0

簡單地放棄線程是快速和骯髒的方式來做到這一點。如果突然殺死你正在運行的所有線程是期望的結果,那麼它應該沒問題。 –

2

試試這個

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    Dim foo As New List(Of Threading.Thread) 
    Threading.Interlocked.Exchange(stopRun, 0L) 
    For x As Integer = 1 To 5 'start five threads 
     Dim t As New Threading.Thread(AddressOf workerThrd) 
     t.IsBackground = True 
     t.Start() 
     foo.Add(t) 'add to list 
    Next 
    Threading.Thread.Sleep(2000) 'wait two seconds 
    Threading.Interlocked.Increment(stopRun) 'signal stop 
    For Each t As Threading.Thread In foo 'wait for each thread to stop 
     t.Join() 
    Next 
    Debug.WriteLine("fini") 
End Sub 

Dim stopRun As Long = 0L 

Private Sub workerThrd() 
    Do While Threading.Interlocked.Read(stopRun) = 0L 
     Threading.Thread.Sleep(10) 'simulate work 
    Loop 
    Debug.WriteLine("end") 
End Sub 
1

如果你想要更多的控制

Here

是一個叫任務非常甜蜜的事情他們一會兒回來。它給你一個更多的控制你的線程

希望這會有所幫助。

相關問題