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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值