大家好,欢迎来到IT知识分享网。

在 C# 中,判断多个线程并行执行结束的方式有几种。以下是一些常见的方式:
1. 使用Task.WhenAll(适用于Task)
如果使用的是 Task 来管理线程,可以使用 Task.WhenAll 来等待多个任务的完成。
csharpCopy Codeusing System; using System.Threading.Tasks; class Program { static async Task Main(string[] args) { // 创建多个任务 Task task1 = Task.Run(() => DoWork(1)); Task task2 = Task.Run(() => DoWork(2)); Task task3 = Task.Run(() => DoWork(3)); // 等待所有任务完成 await Task.WhenAll(task1, task2, task3); Console.WriteLine("所有任务都已完成!"); } static void DoWork(int id) { Console.WriteLine($"Task {id} 开始..."); // 模拟一些工作 Task.Delay(1000).Wait(); Console.WriteLine($"Task {id} 完成..."); } }
在这个例子中,Task.WhenAll 会等待所有传入的 Task 完成后才会继续执行。await 用于异步等待任务完成。
2. 使用ManualResetEvent或AutoResetEvent
如果使用的是 Thread 类来管理线程,可以通过 ManualResetEvent 或 AutoResetEvent 来同步线程的结束。
csharpCopy Codeusing System; using System.Threading; class Program { static void Main() { // 创建事件,用于等待线程结束 ManualResetEvent[] events = new ManualResetEvent[3]; for (int i = 0; i < 3; i++) { events[i] = new ManualResetEvent(false); int taskId = i; // 启动线程 new Thread(() => DoWork(taskId, events[taskId])).Start(); } // 等待所有线程完成 WaitHandle.WaitAll(events); Console.WriteLine("所有线程都已完成!"); } static void DoWork(int id, ManualResetEvent evt) { Console.WriteLine($"线程 {id} 开始..."); Thread.Sleep(1000); // 模拟工作 Console.WriteLine($"线程 {id} 完成..."); evt.Set(); // 通知事件已完成 } }
这里,ManualResetEvent 是用来表示线程是否完成。当线程完成时,调用 evt.Set() 来设置事件,主线程通过 WaitHandle.WaitAll 等待所有线程结束。
3. 使用CountdownEvent
CountdownEvent 用于指定一个初始的计数值,并在每个线程完成时调用 Signal 来减少计数。它非常适合用于等待多个线程完成。
csharpCopy Codeusing System; using System.Threading; class Program { static void Main() { // 初始化 CountdownEvent,计数值为线程数 CountdownEvent countdown = new CountdownEvent(3); for (int i = 0; i < 3; i++) { int taskId = i; new Thread(() => DoWork(taskId, countdown)).Start(); } // 等待所有线程完成 countdown.Wait(); Console.WriteLine("所有线程都已完成!"); } static void DoWork(int id, CountdownEvent countdown) { Console.WriteLine($"线程 {id} 开始..."); Thread.Sleep(1000); // 模拟工作 Console.WriteLine($"线程 {id} 完成..."); countdown.Signal(); // 通知 CountdownEvent,线程已完成 } }
CountdownEvent 提供了一个 Signal() 方法,每次线程完成时调用。主线程可以通过 Wait() 来阻塞直到计数器达到零,表示所有线程都已完成。
总结
- 如果使用 Task,可以使用 Task.WhenAll 来等待所有任务完成。
- 如果使用 Thread,可以使用 ManualResetEvent 或 AutoResetEvent 来同步线程结束。
- CountdownEvent 是另一种可以用于同步多个线程的方法,适用于计数等待。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/169903.html