如何设置DotNetty(Netty)Bootstrap.ConnectAsync超时?

3
我在Unity中使用DotNetty,以下是客户端引导程序代码。当服务器关闭时,它会尝试在约17秒内建立连接,期间客户端会被冻结。实际上,它不需要尝试17秒就知道无法连接。
请问如何配置客户端引导程序使其只尝试5秒钟?
我已经添加了".Option(ChannelOption.ConnectTimeout, TimeSpan.FromMilliseconds(5000))",但仍需要17秒才能停止尝试。该选项只触发了额外的超时异常。
    try
    {
        var clientBootstrap = new Bootstrap();
        clientBootstrap
            .Group(group)
            .Channel<TcpSocketChannel>()
            .Option(ChannelOption.TcpNodelay, true)
            .Option(ChannelOption.ConnectTimeout, TimeSpan.FromMilliseconds(1000))
            .Handler(new ActionChannelInitializer<ISocketChannel>(channel =>
            {
                var pipeline = channel.Pipeline;
                pipeline.AddLast(new IdleStateHandler(0, 0, 6));
                ......
            }));
        clientChannel = await clientBootstrap.ConnectAsync(new IPEndPoint(IPAddress.Parse(IP), Port));

非常感谢。
1个回答

1

根据this,您应该能够设置超时时间:

如果对dotnetty不熟悉,但适用于您的代码片段,我会尝试类似以下的操作:

try
{
    var clientBootstrap = new Bootstrap();
    clientBootstrap
        .Group(group)
        .Channel<TcpSocketChannel>()
        .Option(ChannelOption.TcpNodelay, true)
        .Option(ChannelOption.ConnectTimeout, TimeSpan.FromMilliseconds(1000))
        .Handler(new ActionChannelInitializer<ISocketChannel>(channel =>
        {
            var pipeline = channel.Pipeline;
            pipeline.AddLast(new IdleStateHandler(0, 0, 6));
            ......
        }));
    
    int timeout = 5000;
    var clientChannel = clientBootstrap.ConnectAsync(new IPEndPoint(IPAddress.Parse(IP), Port));
    if (await Task.WhenAny(clientChannel, Task.Delay(timeout)) == clientChannel) {
        // task completed within timeout
    } else { 
        // timeout logic
    }
}

阅读任务延迟文档很有帮助:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接