2012-08-24 50 views
3

我有VS2010,我正在開發一個Windows窗體應用程序。因此,我有動態創建的線程(取決於用戶輸入),這些線程的處理可能需要一段時間的安靜(極端情況下的幾天)。所以我在表單上放了一個按鈕,並希望能夠「暫停」或「暫停」線程。我查了一下.suspend方法,它已被替換(我嘗試過使用它,但它有時會失敗 - 導致UI崩潰),所以我發現的新方法是'waithandle'。我已經閱讀了這個文檔,我無法解決如何使用它。如何在vb.net中使用waitHandle

這是每個線程的基本結構:

Do 
    'time consuming operations 
loop 'a number of times 

然後在一個單獨的按鈕,我想提出的暫停碼。並不是那麼重要,它很快就暫停了,在下一次循環中暫停是正常的(每次運行都很快,它只是做了幾百次)。我假設我必須在循環開始時進行waithandle檢查,但實際上我不知道如何實現這一點。這是我的WaitHandle昏暗代碼:

Dim waitHandles As System.Threading.EventWaitHandle = New System.Threading.AutoResetEvent(True) 

所有線程都在一次暫停(除主UI線程),所以我想這意味着我只需要一個等待句柄,但我不知道這件事。

無論如何,如果任何人都可以告訴我什麼代碼進入循環,什麼進入暫停按鈕,我想我可以通過其他一切工作。 :)

非常感謝!

弗雷澤


從評論:

謝謝!我得到了它的工作。這裏是我的執行力度:

Dim mre As New System.Threading.ManualResetEvent(True) 

(這是在代碼(只是在「公共類方式1」的頂部) 然後在線程它具有:

mre.WaitOne(), 

終於在暫停按鈕/取消暫停線程它具有:

mre.Reset() 'to resume the threads and, mre.Set() 'to pause the threads 

回答

1

使用ManualResetEvent的這一個的AutoResetEvent是「幾乎一個信號」中,你將不得不爲你的線程,以表示它多次。正在等待 - 在某些情況下,這可能會變得尷尬。

創建事件發信號(即設置),並在線程中等待系統調用等待對線程中的循環產生微不足道的影響。也許不在最內層的循環中。

清除「暫停」按鈕OnClick()中的事件,將其設置在您的「恢復」OnClick()中。

對不起,沒有實際的代碼'因爲我沒有任何VB,但它應該很容易做:)

+0

謝謝!我得到了它的工作。這裏是我的實踐:Dim mre As New System.Threading.ManualResetEvent(True)(位於代碼的頂部(在'public class form 1'下面),然後在線程中有:mre。WaitOne(),最後在暫停/取消暫停線程的按鈕中:mre.Reset()'恢復線程,mre.Set()'暫停線程:)(如果有人可以編輯它更整潔一些,我認爲這會對其他人有所幫助,我只是不知道如何!) – FraserOfSmeg