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;
}
}
}
}
}
C#:一个增强的TcpClient(七)独立通信线程
最新推荐文章于 2024-06-20 09:59:01 发布