C# Thread 執行緒(執行序) 控制 開始/暫停/恢復/停止 的方法
C# Thread 執行緒(執行序) 控制 開始/暫停/恢復/停止 的方法
資料來源: https://dotblogs.com.tw/AlexWang/2016/10/03/124332
Code:
public class ThreadWorker { Thread _thread; ManualResetEvent _shutdownEvent; ManualResetEvent _pauseEvent; public void ThreadJob() { while (true) { // pause event : if WaitHandle is false, it will wait and return false _pauseEvent.WaitOne(Timeout.Infinite); // stop event if (_shutdownEvent.WaitOne(0)) break; // work here Console.WriteLine(DateTime.Now); // like Thread.Sleep(1000), but higher efficiency SpinWait.SpinUntil(() => false, 1000); } Console.WriteLine("Work is completed or stopped"); } public void Start() { Console.WriteLine("Add a new thread"); _thread = new Thread(ThreadJob); _shutdownEvent = new ManualResetEvent(false); _pauseEvent = new ManualResetEvent(true); _thread.IsBackground = true; _thread.Start(); } public void Pause() { // Set WaitHandle false _pauseEvent.Reset(); } public void Resume() { // Set WaitHandle true _pauseEvent.Set(); } public void Stop() { // trigger stop _shutdownEvent.Set(); // if thread suspend, let it resume. _pauseEvent.Set(); _thread.Join(); _thread = null; } } class Program { static void Main(string[] args) { ThreadWorker _threadWorker = new ThreadWorker(); Console.WriteLine("[Start 5s]"); _threadWorker.Start(); Thread.Sleep(5000); Console.WriteLine("[Pause 10s]"); _threadWorker.Pause(); Thread.Sleep(10000); Console.WriteLine("[Resume 3s]"); _threadWorker.Resume(); Thread.Sleep(3000); Console.WriteLine("[Stop]"); _threadWorker.Stop(); Thread.Sleep(5000); Console.WriteLine("[Start again 3s]"); _threadWorker.Start(); Thread.Sleep(3000); Console.WriteLine("[Pause 3s]"); _threadWorker.Pause(); Thread.Sleep(3000); Console.WriteLine("[Resume 2s]"); _threadWorker.Resume(); Thread.Sleep(2000); Console.WriteLine("[Stop]"); _threadWorker.Stop(); Console.ReadKey(); } }