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

标签 c# .net sockets asynchronous

我有一个简单的控制台应用程序,它等待传入连接,然后将任何传入连接通过管道/隧道传输到绑定(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/

相关文章:

c# - FB.Logout() 在 Facebook UnitySDK 中不起作用

c# - 在不关注 TabControl 选项卡的情况下循环

multithreading - WSA发送到多线程iocp服务器中的所有已连接套接字

linux - Shell 脚本使用 netstat 查明某个端口是否正在被监听?

.net - 缩放整个 WPF 窗口

java - 如何从Java获取Linux机器的实际IP

c# - 如何在 C# 中迭代​​时修改或删除可枚举集合中的项目

c# - 与 Cisco 电话的 TAPI;使用 "sidecar"800 模块

c# - HTML 电子邮件 : Must you send an alternate plain text view as well?

c# - 如何在 DataGridView 中抑制自动生成的列?