在C#中,可以使用ManualResetEvent來實現(xiàn)線程的暫停和恢復。ManualResetEvent是一個同步對象,它包含一個布爾值,表示是否發(fā)出信號。當布爾值為true時,表示信號已發(fā)出,線程可以繼續(xù)執(zhí)行;當布爾值為false時,表示信號未發(fā)出,線程需要暫停等待。
下面是一個示例代碼,演示了如何使用ManualResetEvent來實現(xiàn)線程的暫停和恢復:
using System;
using System.Threading;
public class Program
{
private static ManualResetEvent pauseEvent = new ManualResetEvent(true); // 初始狀態(tài)為true,線程可以繼續(xù)執(zhí)行
public static void Main(string[] args)
{
Thread thread = new Thread(WorkerThread);
thread.Start();
Console.WriteLine("Press any key to pause the thread...");
Console.ReadKey();
PauseThread(); // 暫停線程
Console.WriteLine("Press any key to resume the thread...");
Console.ReadKey();
ResumeThread(); // 恢復線程
Console.WriteLine("Press any key to stop the thread...");
Console.ReadKey();
StopThread(); // 停止線程
}
private static void WorkerThread()
{
while (true)
{
// 檢查是否暫停線程
pauseEvent.WaitOne();
// 執(zhí)行任務
Console.WriteLine("Working...");
// 模擬耗時操作
Thread.Sleep(1000);
}
}
private static void PauseThread()
{
pauseEvent.Reset(); // 設置為false,線程將暫停等待
}
private static void ResumeThread()
{
pauseEvent.Set(); // 設置為true,線程將繼續(xù)執(zhí)行
}
private static void StopThread()
{
pauseEvent.Set(); // 設置為true,確保線程可以繼續(xù)執(zhí)行以結束循環(huán)
// 其他處理邏輯...
// 終止線程
Environment.Exit(0);
}
}
在上面的示例中,程序創(chuàng)建了一個線程(WorkerThread),并在主線程中通過按鍵的方式來控制線程的暫停和恢復。在WorkerThread中,使用pauseEvent的WaitOne方法來檢查是否暫停線程,如果暫停,則線程會處于等待狀態(tài),直到調(diào)用ResumeThread方法將pauseEvent設置為true,線程才會繼續(xù)執(zhí)行。
需要注意的是,使用ManualResetEvent來實現(xiàn)線程的暫停和恢復時,線程不能被阻塞在其他的同步對象(如Mutex、Semaphore等)上,否則可能會出現(xiàn)死鎖的情況。