翼度科技»论坛 编程开发 .net 查看内容

C#多线程精解:优雅终止线程的实用方法与技巧

9

主题

9

帖子

27

积分

新手上路

Rank: 1

积分
27
 
概述:在C#多线程编程中,合理终止线程是关键挑战。通过标志位或CancellationToken,实现安全、协作式的线程终止,确保在适当时机终止线程而避免资源泄漏。
应用场景:

在C#多线程编程中,有时需要终止正在运行的线程,例如在用户取消操作、程序关闭等情况下。
思路:

线程终止通常涉及到合作式终止而非强制终止,因为强制终止可能导致资源泄漏和不确定的状态。一般采用标志位、信号等方式,让线程自行安全地退出。
方法和步骤:

1.使用标志位控制线程执行:
  1. using System;
  2. using System.Threading;
  3. public class Worker
  4. {
  5.     // 标志位,用于控制线程执行
  6.     private volatile bool shouldStop = false;
  7.     public void DoWork()
  8.     {
  9.         while (!shouldStop)
  10.         {
  11.             // 线程执行的工作
  12.             Console.WriteLine("Working...");
  13.             Thread.Sleep(1000); // 模拟工作
  14.         }
  15.     }
  16.     // 设置标志位,终止线程
  17.     public void StopWork()
  18.     {
  19.         shouldStop = true;
  20.     }
  21. }
  22. public class Program
  23. {
  24.     public static void Main()
  25.     {
  26.         Worker worker = new Worker();
  27.         // 启动线程执行工作
  28.         Thread thread = new Thread(worker.DoWork);
  29.         thread.Start();
  30.         // 模拟运行一段时间后,终止线程
  31.         Thread.Sleep(5000);
  32.         worker.StopWork();
  33.         // 等待线程结束
  34.         thread.Join();
  35.         Console.WriteLine("Thread stopped.");
  36.     }
  37. }
复制代码
上述代码中,通过设置shouldStop标志位,线程在下一个循环中检查到标志位为true时自动退出。
2.使用CancellationToken终止线程:
  1. using System;
  2. using System.Threading;
  3. public class Worker
  4. {
  5.     // CancellationTokenSource用于生成CancellationToken
  6.     private CancellationTokenSource cts = new CancellationTokenSource();
  7.     public void DoWork()
  8.     {
  9.         CancellationToken token = cts.Token;
  10.         while (!token.IsCancellationRequested)
  11.         {
  12.             // 线程执行的工作
  13.             Console.WriteLine("Working...");
  14.             Thread.Sleep(1000); // 模拟工作
  15.         }
  16.     }
  17.     // 使用CancellationToken请求终止线程
  18.     public void StopWork()
  19.     {
  20.         cts.Cancel();
  21.     }
  22. }
  23. public class Program
  24. {
  25.     public static void Main()
  26.     {
  27.         Worker worker = new Worker();
  28.         // 启动线程执行工作
  29.         Thread thread = new Thread(worker.DoWork);
  30.         thread.Start();
  31.         // 模拟运行一段时间后,终止线程
  32.         Thread.Sleep(5000);
  33.         worker.StopWork();
  34.         // 等待线程结束
  35.         thread.Join();
  36.         Console.WriteLine("Thread stopped.");
  37.     }
  38. }
复制代码
上述代码中,通过CancellationToken及其关联的CancellationTokenSource,在StopWork方法中调用Cancel方法通知线程终止。
在实际应用中,需要根据具体场景选择合适的终止线程的方式,并确保线程能够在终止时完成清理工作。
 


来源:https://www.cnblogs.com/hanbing81868164/p/18018739
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具