77 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C#
		
	
	
			
		
		
	
	
			77 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C#
		
	
	
using System;
 | 
						|
using base_kcp;
 | 
						|
using DotNetty.Common.Utilities;
 | 
						|
using dotNetty_kcp.thread;
 | 
						|
 | 
						|
namespace dotNetty_kcp
 | 
						|
{
 | 
						|
    public class ScheduleTask:IScheduleTask,ITask
 | 
						|
    {
 | 
						|
        private readonly IMessageExecutor _imessageExecutor;
 | 
						|
 | 
						|
        private readonly IChannelManager _channelManager;
 | 
						|
 | 
						|
        private readonly Ukcp _ukcp;
 | 
						|
 | 
						|
        private readonly IScheduleThread _scheduleThread;
 | 
						|
 | 
						|
 | 
						|
        public ScheduleTask(IChannelManager channelManager, Ukcp ukcp, IScheduleThread scheduleThread)
 | 
						|
        {
 | 
						|
            _imessageExecutor = ukcp.IMessageExecutor;
 | 
						|
            _channelManager = channelManager;
 | 
						|
            _ukcp = ukcp;
 | 
						|
            _scheduleThread = scheduleThread;
 | 
						|
        }
 | 
						|
 | 
						|
        public void execute()
 | 
						|
        {
 | 
						|
            try
 | 
						|
            {
 | 
						|
                long now = _ukcp.currentMs();
 | 
						|
                //判断连接是否关闭
 | 
						|
                if (_ukcp.TimeoutMillis != 0 && now - _ukcp.TimeoutMillis > _ukcp.LastRecieveTime) {
 | 
						|
                    _ukcp.internalClose();
 | 
						|
                }
 | 
						|
                if(!_ukcp.isActive()){
 | 
						|
                    var user = _ukcp.user();
 | 
						|
                    //抛回网络线程处理连接删除
 | 
						|
                    user.Channel.EventLoop.Execute(() => {_channelManager.del(_ukcp);});
 | 
						|
                    _ukcp.release();
 | 
						|
                    return;
 | 
						|
                }
 | 
						|
                long timeLeft = _ukcp.getTsUpdate()-now;
 | 
						|
                //判断执行时间是否到了
 | 
						|
                if(timeLeft>0){
 | 
						|
                    //System.err.println(timeLeft);
 | 
						|
                    _scheduleThread.schedule(this, TimeSpan.FromMilliseconds(timeLeft));
 | 
						|
                    return;
 | 
						|
                }
 | 
						|
 | 
						|
                //long start = System.currentTimeMillis();
 | 
						|
                long next = _ukcp.flush(now);
 | 
						|
                //System.err.println(next);
 | 
						|
                //System.out.println("耗时  "+(System.currentTimeMillis()-start));
 | 
						|
                _scheduleThread.schedule(this, TimeSpan.FromMilliseconds(next));
 | 
						|
 | 
						|
                //检测写缓冲区 如果能写则触发写事件
 | 
						|
                if(!_ukcp.WriteQueue.IsEmpty&&_ukcp.canSend(false)
 | 
						|
                ){
 | 
						|
                    _ukcp.notifyWriteEvent();
 | 
						|
                }
 | 
						|
            } catch (Exception e) {
 | 
						|
                Console.WriteLine(e);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        public void Run(ITimeout timeout)
 | 
						|
        {
 | 
						|
            _imessageExecutor.execute(this);
 | 
						|
        }
 | 
						|
 | 
						|
        public void Run()
 | 
						|
        {
 | 
						|
            _imessageExecutor.execute(this);
 | 
						|
        }
 | 
						|
    }
 | 
						|
} |