我有一个简单的控制台应用程序,它等待传入的连接,然后管道/隧道传输到绑定到环回接口的本地服务的任何传入连接。
执行此隧道的方法是异步和长时间运行 - 它们仅在内部服务停止或客户端断开连接时(可能持续数小时)终止。目前这是有效的,但我不确定这种方法是否正确,因为我没有"等待"在长期运作中。我很好奇处理这个问题的正确方法是什么?
编译器实际上抱怨:因为不等待此调用,所以在调用完成之前继续执行当前方法。考虑应用“等待”#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);
}
}
}
答案 0 :(得分:3)
这是正确的。由于您不想等待,因此无需等待。
确保处理所有错误。丢弃的异常使调试变得困难。例如,你可以这样做:
Task.WhenAll(a, b).ContinueWith(_ => /* handle errors */);
处理错误的任何其他方式也可以。