C#:一个增强的TcpClient(七)独立通信线程

using System; using System.Threading; namespace Splash.Net.Sockets { /// <summary> /// 实现独立的通信线程 /// </summary> public partial class TcpClientPlus { /// <summary> /// 信道空闲等待时间,默认1秒 /// </summary> private const Int32 IdleTimeout = 1000; // 委托声明 public delegate void ThreadTaskRequest(object sender, EventArgs e); // 定义一个委托类型的事件 public event ThreadTaskRequest OnThreadTaskRequest; /// <summary> /// 独立的通信线程处理器 /// </summary> protected Thread _TaskThread; /// <summary> /// 信道空闲事件 /// </summary> protected ManualResetEvent _ChannelIdleEvent; /// <summary> /// 任务到达事件 /// </summary> protected ManualResetEvent _TaskArrivedEvent; /// <summary> /// 独立通信线程结束信号 /// </summary> private volatile Boolean _shouldStop; /// <summary> /// 启动独立的通信线程 /// </summary> /// <param name="action">线程任务处理函数</param> public void ThreadTaskStart() { if (_TaskThread == null) { _ChannelIdleEvent = new ManualResetEvent(true); // 初始化信道空闲 _TaskArrivedEvent = new ManualResetEvent(false); // 初始化任务空闲 _shouldStop = false; // 创建并启动独立的通信线程 _TaskThread = new Thread(new ThreadStart(ThreadTaskAction)); _TaskThread.Start(); } } /// <summary> /// 终止独立的通信线程 /// </summary> public void ThreadTaskAbort() { // 终止独立通信线程 if (_TaskThread != null) { _shouldStop = true; // 设置线程结束信号 _TaskArrivedEvent.Set(); // 设置任务到达事件 } // 关闭信道空闲事件 if (_ChannelIdleEvent != null) { _ChannelIdleEvent.Close(); _ChannelIdleEvent = null; } // 关闭任务到达事件 if (_TaskArrivedEvent != null) { _TaskArrivedEvent.Close(); _TaskArrivedEvent = null; } } /// <summary> /// 独立通信线程任务派发 /// </summary> /// <returns> /// true:任务派发成功 /// false:任务派发失败 /// </returns> /// <remarks> /// 执行OnThreadTaskRequest关联的事件 /// </remarks> public Boolean ThreadTaskAllocation() { // 启动独立的通信线程 if (_TaskThread == null) { ThreadTaskStart(); } // 等待信道空闲 if (_ChannelIdleEvent.WaitOne(IdleTimeout, false)) { _ChannelIdleEvent.Reset(); // 设置信道忙 _TaskArrivedEvent.Set(); // 设置任务到达 return true; // 任务派发成功 } else { return false; // 任务派发失败 } } /// <summary> /// 独立通信线程任务派发 /// </summary> /// <param name="task">要派发的任务请求</param> /// <returns> /// true:任务派发成功 /// false:任务派发失败 /// </returns> /// <remarks> /// 更新OnThreadTaskRequest为当前任务并执行 /// </remarks> public Boolean ThreadTaskAllocation(ThreadTaskRequest task) { // 启动独立的通信线程 if (_TaskThread == null) { ThreadTaskStart(); } // 等待信道空闲 if (_ChannelIdleEvent.WaitOne(IdleTimeout, false)) { // 设置信道忙 _ChannelIdleEvent.Reset(); // 清空事件调用列表 if (OnThreadTaskRequest != null) { foreach (Delegate d in OnThreadTaskRequest.GetInvocationList()) { OnThreadTaskRequest -= (ThreadTaskRequest)d; } } // 更新事件调用列表 OnThreadTaskRequest += task; // 设置任务到达 _TaskArrivedEvent.Set(); return true; // 任务派发成功 } else { return false; // 任务派发失败 } } /// <summary> /// 独立通信线程处理器 /// </summary> private void ThreadTaskAction() { try { while (true) { // 等待任务到达 if (_TaskArrivedEvent.WaitOne()) { // 检测线程结束信号 if (_shouldStop) break; try { // 执行任务 if (OnThreadTaskRequest != null) { OnThreadTaskRequest(this, EventArgs.Empty); } } catch { // 阻止异常抛出 } // 等待新的任务 if (_TaskArrivedEvent != null) _TaskArrivedEvent.Reset(); // 设置信道空闲 if (_ChannelIdleEvent != null) _ChannelIdleEvent.Set(); // 再次检测线程结束信号 if (_shouldStop) break; } } // End While } catch { // 阻止异常抛出 } // 保证线程资源释放 finally { // 线程关闭 _TaskThread = null; // 关闭信道空闲事件 if (_ChannelIdleEvent != null) { _ChannelIdleEvent.Close(); _ChannelIdleEvent = null; } // 关闭任务到达事件 if (_TaskArrivedEvent != null) { _TaskArrivedEvent.Close(); _TaskArrivedEvent = null; } } } } }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值