指定时间终止线程?

本文展示了一个使用C#编写的简单UDP服务示例,该服务通过两个线程实现:一个用于持续监听并处理来自客户端的数据请求,另一个则用于控制主线程的运行时长。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 
指定时间终止线程?

public   class   WebForm1   :   System.Web.UI.Page  
  {  
  private   UdpClient   server;  
  private   IPEndPoint   receivePoint; //将网络端点表示为IP地址和端口号  
  private   IPEndPoint   sendPoint; //本地网络端点  
  private   int   port   =   1171; //本地的端口号  
  private   int   desPort   =   20048; //远端机顶盒的端口号  
  private   Thread   startServer;  
  private   Thread   setThreadFlag; //用于设置startServer线程的  
  private   bool   threadFlag;  
  private   StringBuilder   sb   =   new   StringBuilder();  
   
  protected   System.Web.UI.WebControls.Label   Label1;  
   
  private   void   Page_Load(object   sender,   System.EventArgs   e)  
  {  
  if   (!IsPostBack)  
  {  
  Run();  
  }  
  }  
   
  #region   Web   窗体设计器生成的代码  
  override   protected   void   OnInit(EventArgs   e)  
  {  
  //  
  //   CODEGEN:   该调用是   ASP.NET   Web   窗体设计器所必需的。  
  //  
  InitializeComponent();  
  base.OnInit(e);  
  }  
   
  ///   <summary>  
  ///   设计器支持所需的方法   -   不要使用代码编辑器修改  
  ///   此方法的内容。  
  ///   </summary>  
  private   void   InitializeComponent()  
  {          
  this.Load   +=   new   System.EventHandler(this.Page_Load);  
   
  }  
  #endregion  
   
  ///   <summary>  
  ///   开启一个线程执行UDP服务  
  ///   </summary>  
  private   void   Run()  
  {  
   
  server   =   new   UdpClient(port);  
   
  receivePoint   =   new   IPEndPoint(IPAddress.Broadcast,   port);  
  sendPoint   =   new   IPEndPoint(IPAddress.Broadcast,   desPort);  
   
  //开启一个线程  
  startServer   =   new   Thread(new   ThreadStart(StartServer));  
  setThreadFlag   =   new   Thread(new   ThreadStart(SetThreadFlag));  
  startServer.Start();  
  setThreadFlag.Start();  
   
  Label1.Text   =   sb.ToString();  
   
  startServer.Abort();  
  setThreadFlag.Abort();  
  }  
   
  ///   <summary>  
  ///   执行UDP服务  
  ///   </summary>  
  private   void   StartServer()  
  {  
  threadFlag   =   true;  
   
  byte[]   receiveData;  
  ASCIIEncoding   encode   =   new   ASCIIEncoding();  
   
  byte[]   sendData   =   encode.GetBytes("Query:FFFFFF");  
  server.Send(sendData,   sendData.Length,   sendPoint);  
   
  while(threadFlag)  
  {  
  //接收从远程主机发送到本地的数据  
  receiveData   =   server.Receive(ref   receivePoint);  
   
  string   receiveString   =   encode.GetString(receiveData);  
  sb.Append("Data:   "   +   receiveString);  
  sb.Append("<br>");  
  sb.Append("IP:   "   +   receivePoint.Address);  
  sb.Append("<br>");  
  sb.Append("Port:   "   +   receivePoint.Port);  
  sb.Append("<br>");  
  }  
  }  
   
  private   void   SetThreadFlag()  
  {  
  Thread.Sleep(1000);  
  threadFlag   =   false;  
  }  
  }   
 

转载于:https://www.cnblogs.com/ringnet/archive/2008/01/08/1030082.html

<think>好的,用户问如何在C#中安全终止线程。我之前已经回答过关于关闭指定线程的问题,现在用户具体到C#的安全终止方法。首先,我需要回忆C#中线程管理的最佳实践,尤其是如何正确停止线程。 记得在C#里,Thread.Abort方法已经不推荐使用了,因为会导致不稳定,比如资源泄漏或状态不一致。所以应该用协作式取消,也就是让线程自己检查是否应该停止。这通常通过CancellationToken来实现。 用户可能需要一个例子来展示具体怎么做。我需要分步骤说明:创建CancellationTokenSource,传递CancellationToken给线程函数,在线程内部定期检查是否取消,并调用Cancel方法来触发停止。 还要注意处理可能的异常,比如OperationCanceledException,这样线程可以在被取消时进行清理工作。此外,确保线程函数有机会退出循环或长时间运行的操作。 然后,我需要考虑用户的实际应用场景,比如长时间运行的任务,如何优雅地停止而不强制终止。可能还需要提到Dispose方法释放资源,以及IsCancellationRequested属性的使用。 最后,验证示例代码是否正确,确保没有使用过时的Abort方法,并且符合.NET Core或.NET5+的标准,因为旧的.NETFramework可能有不同的行为。确认代码的可运行性,比如控制台应用的示例,让用户能够直接测试。 可能用户之前的问题是关于关闭线程,现在具体到C#,所以需要强调安全性和正确的方法,避免用户使用不推荐的方式。还要提醒用户,即使使用CancellationToken,线程可能不会立即停止,需要合理设计循环和检查点。 总结回答的结构:先说明旧方法的问题,推荐新方法,分步骤解释代码,示例展示,然后注意事项和相关问题。这样用户能清晰理解如何安全终止线程,并知道其他相关的问题点。</think>在 C# 中安全终止线程应使用协作式取消模式(`CancellationToken`),而不是强制终止线程(如已废弃的 `Thread.Abort`)。以下是完整实现方案: ```csharp using System; using System.Threading; using System.Threading.Tasks; class Program { static CancellationTokenSource cts = new CancellationTokenSource(); static void Main() { // 启动工作线程 var workerTask = Task.Run(() => DoWork(cts.Token), cts.Token); // 模拟运行3秒后取消 Thread.Sleep(3000); RequestCancel(); try { workerTask.Wait(); } catch (AggregateException ae) { foreach (var e in ae.InnerExceptions) { if (e is TaskCanceledException) { Console.WriteLine("任务已安全取消"); } } } } static void DoWork(CancellationToken token) { try { while (true) { token.ThrowIfCancellationRequested(); // 模拟工作内容 Console.WriteLine("Working..."); Thread.Sleep(500); } } catch (OperationCanceledException) { // 执行清理操作 Console.WriteLine("正在清理资源..."); throw; } } static void RequestCancel() { cts.Cancel(); Console.WriteLine("取消请求已发送"); } } ``` 代码关键点解释: 1. 使用 `CancellationTokenSource` 和 `CancellationToken` 实现取消协议 2. `ThrowIfCancellationRequested()` 方法会在检测到取消请求时抛出 `OperationCanceledException` 3. 通过 `Task.Run` 启动的线程可以自动传播取消状态 4. 在 `catch` 块中进行资源清理 5. 主线程使用 `Wait()` 等待工作线程完成清理 注意事项: - 禁止使用 `Thread.Abort()`,可能导致资源泄漏和状态不一致 - 应在循环或长时间操作中定期检查取消标记 - 对于 I/O 操作,应使用支持 CancellationToken 的异步 API - 调用 `Cancel()` 后应等待线程完全退出
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值