Обработчик сделает это за вас.Если вы наследуете от IdleStateHandler
, все, что вам действительно нужно сделать, - это реализовать один или несколько его конструкторов и переопределить ChannelIdle
.Вот простой пример, который закрывает соединение после определенного периода бездействия;он автоматически сбрасывается при наличии активности:
public class TimeoutHandler : IdleStateHandler
{
/// <summary>
/// Initializes a new instance firing <see cref="T:DotNetty.Handlers.Timeout.IdleStateEvent" />s.
/// </summary>
/// <param name="readerIdleTimeSeconds">
/// an <see cref="T:DotNetty.Handlers.Timeout.IdleStateEvent" /> whose state is <see cref="F:DotNetty.Handlers.Timeout.IdleState.ReaderIdle" />
/// will be triggered when no read was performed for the specified
/// period of time. Specify <code>0</code> to disable.
/// </param>
/// <param name="writerIdleTimeSeconds">
/// an <see cref="T:DotNetty.Handlers.Timeout.IdleStateEvent" /> whose state is <see cref="F:DotNetty.Handlers.Timeout.IdleState.WriterIdle" />
/// will be triggered when no write was performed for the specified
/// period of time. Specify <code>0</code> to disable.
/// </param>
/// <param name="allIdleTimeSeconds">
/// an <see cref="T:DotNetty.Handlers.Timeout.IdleStateEvent" /> whose state is <see cref="F:DotNetty.Handlers.Timeout.IdleState.AllIdle" />
/// will be triggered when neither read nor write was performed for
/// the specified period of time. Specify <code>0</code> to disable.
/// </param>
public TimeoutHandler(int readerIdleTimeSeconds, int writerIdleTimeSeconds, int allIdleTimeSeconds) : base(readerIdleTimeSeconds, writerIdleTimeSeconds, allIdleTimeSeconds)
{
}
protected override void ChannelIdle(IChannelHandlerContext context, IdleStateEvent stateEvent)
{
context.CloseAsync();
}
}
Чтобы добавить его в конвейер с периодом бездействия 60 секунд (для любой тип бездействия):
pipeline.AddLast(name: "idle-handler", new
TimeoutHandler(readerIdleTimeSeconds: 60, writerIdleTimeSeconds: 60, allIdleTimeSeconds: 60));
Стоит посмотреть на исходный код для DotNetty IdleStateHandler
(учитывая отсутствие документации).Например, вы увидите, что в WriteAsync
по завершении задачи записи сбрасывается lastWriteTime
.