时间:2015-09-22 19:54:56

标签: c# .net sockets asynchronous

我有一个简单的控制台应用程序,它等待传入的连接,然后管道/隧道传输到绑定到环回接口的本地服务的任何传入连接。

执行此隧道的方法是异步和长时间运行 - 它们仅在内部服务停止或客户端断开连接时(可能持续数小时)终止。目前这是有效的,但我不确定这种方法是否正确,因为我没有"等待"在长期运作中。我很好奇处理这个问题的正确方法是什么?

编译器实际上抱怨:因为不等待此调用,所以在调用完成之前继续执行当前方法。考虑应用“等待”#39;运算符到调用的结果。

public async Task Start(CancellationToken ct)
{
    _socket.Bind(_portMapping.Source);
    _socket.Listen(MaxQueuedConnections);
    var args = new SocketAsyncEventArgs();
    var awaitable = new SocketAwaitable(args);

    while (!ct.IsCancellationRequested)
    {
        args.AcceptSocket = null;
        await _socket.AcceptAsync(awaitable);
        var listenerSource = args.AcceptSocket;

        var feed = new MyForwarder(_portMapping.Remote.Address, 
                                   _portMapping.Remote.Port, MaxRetries);
        feed.Connect();
        if (feed.Socket.Connected && listenerSource != null && listenerSource.Connected)
        {
            // Both calls are async and long running.  How should I handle as I want
            // to continue to listen for an incoming connection 
            feed.Pipe(listenerSource, ct);
            ForwardHelper.Pipe(listenerSource, feed.Socket, ct);
        }
    }
}

1 个答案:

答案 0 :(得分:3)

这是正确的。由于您不想等待,因此无需等待。

确保处理所有错误。丢弃的异常使调试变得困难。例如,你可以这样做:

Task.WhenAll(a, b).ContinueWith(_ => /* handle errors */);

处理错误的任何其他方式也可以。