upm_guru_kcp/Runtime/csharp-kcp/dotNetty-kcp/ScheduleTask.cs

77 lines
2.5 KiB
C#
Raw Normal View History

2023-08-30 05:50:21 +00:00
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);
}
}
}