public async Task TestCloseAsync() { var group = new MultithreadEventLoopGroup(); var addr = new LocalAddress(ChannelPoolTestUtils.GetLocalAddrId()); Bootstrap cb = new Bootstrap().RemoteAddress(addr).Group(group).Channel <LocalChannel>(); ServerBootstrap sb = new ServerBootstrap() .Group(group) .Channel <LocalServerChannel>() .ChildHandler( new ActionChannelInitializer <LocalChannel>( ch => ch.Pipeline.AddLast(new ChannelHandlerAdapter())) ); // Start server IChannel sc = await sb.BindAsync(addr); var handler = new CountingChannelPoolHandler(); var pool = new SimpleChannelPool(cb, handler); var ch1 = await pool.AcquireAsync(); var ch2 = await pool.AcquireAsync(); pool.ReleaseAsync(ch1).Wait(TimeSpan.FromSeconds(1)); pool.ReleaseAsync(ch2).Wait(TimeSpan.FromSeconds(1)); // Assert that returned channels are open before close Assert.True(ch1.Open); Assert.True(ch2.Open); // Close asynchronously with timeout await pool.CloseAsync().WithTimeout(TimeSpan.FromSeconds(1)); // Assert channels were indeed closed Assert.False(ch1.Open); Assert.False(ch2.Open); await sc.CloseAsync(); pool.Close(); await group.ShutdownGracefullyAsync(TimeSpan.FromMilliseconds(100), TimeSpan.FromSeconds(5)); }