gpt4 book ai didi

c# - 开始一个不需要等待的任务

转载 作者:太空宇宙 更新时间:2023-11-03 23:29:46 24 4
gpt4 key购买 nike

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

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

编译器实际上会提示:因为没有等待这个调用,所以在调用完成之前继续执行当前方法。考虑将“await”运算符应用于调用结果。

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);
}
}
}

最佳答案

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

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

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

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

关于c# - 开始一个不需要等待的任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32725698/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com