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