多線程的暫停繼續(xù)
多線程的暫停繼續(xù),.NET為我們提供了另外一個(gè)對象——ManualResetEvent,這個(gè)對象會有一個(gè)值,這個(gè)值是布爾類型,就像一個(gè)門閘一樣,True是打開門閘,F(xiàn)alse是關(guān)閉門閘,所以想要暫停多線程就調(diào)用這個(gè)對象的Reset方法,想要繼續(xù)多線程就調(diào)用這個(gè)對象的Set方法,使用非常簡單。
首先我們創(chuàng)建一下這個(gè)對象,可以通過構(gòu)造方法,給這個(gè)對象賦初始值,我這里為True,這樣就能直接運(yùn)行,不會阻塞。
/// <summary>
/// 線程暫?刂,默認(rèn)開啟
/// </summary>
private ManualResetEvent manual = new ManualResetEvent(true);
但是如果希望這個(gè)對象與多線程有所聯(lián)系,必須要在多線程的方法里體現(xiàn)這個(gè)對象的作用,這個(gè)是調(diào)用這個(gè)對象的WaitOne方法,表示在調(diào)用的地方阻塞住,通過判斷True或者False來決定是否繼續(xù)執(zhí)行,就像大家開車過高速收費(fèi)站一樣,即使現(xiàn)在普遍采用ETC了,在入口也需要減速,有一個(gè)ETC識別的過程,識別成功才會抬桿,識別識別,桿子是不會自動抬起的,這個(gè)是一樣的道理。
所以線程執(zhí)行代碼如下:
/// <summary>
/// 多線程執(zhí)行方法
/// </summary>
private void TaskMethod()
{
while (!cts.IsCancellationRequested)
{
manual.WaitOne();
CurrentValue++;
if (CurrentValue == 200)
{
CurrentValue = 0;
}
Thread.Sleep(100);
}
}
對比一下,其實(shí)就是加了一個(gè)manual.WaitOne()。
線程暫停代碼:
private void btn_Pause_Click(object sender, EventArgs e)
{
manual.Reset();
}
線程繼續(xù)代碼:
private void btn_Continue_Click(object sender, EventArgs e)
{
manual.Set();
}
AutoResetEvent
AutoResetEvent和ManualResetEvent的用法非常相似,區(qū)別在于一個(gè)是手動,一個(gè)是自動,AutoResetEvent會在置位之后自動復(fù)位,這樣體現(xiàn)在多線程里,就是會只執(zhí)行一次,就像大家進(jìn)小區(qū)一樣,如果有10輛車在排隊(duì),這時(shí)候如果自動模式,每次只能進(jìn)一輛車,如果是手動模式,可以由保安控制門閘打開,等10輛車都進(jìn)去之后,再由保安將門閘關(guān)注。