关闭关联的套接字后取消监听任务

Cancel listening Task upon closing its associated socket

我有一个TcpListener,可以启动

public void Start()
{
    if (!Listening && !IsDisposed)
    {
        _socket.Bind(_localEndpoint);
        Task.Run(DoListen);
    }
}

private async Task DoListen()
{
    _socket.Listen();
    Listening = true;
    try
    {
        while (Listening)
        {
            var socket = await _socket.AcceptAsync().ConfigureAwait(false);
            NewConnection?.Invoke(new Connection(socket));
        }
    }
    catch (SocketException e)
    {
        Stop();
    }
    finally
    {
        Listening = false;
    }
}

并停止

public void Stop()
{
    _socket?.Close();
    IsDisposed = true;
    Listening = false;
}

如何取消通过调用 Start() 启动的任务?
通过使循环条件 Listening,我可以确保在评估条件时任务将停止。
但是,这只有在接受新连接后才会发生。
我怎样才能摆脱等待 var socket = await _socket.AcceptAsync().ConfigureAwait(false);? 如果关联的套接字在等待 AcceptAsync() 时关闭,会发生什么情况? 感谢您的回答!

使用 CancellationTokenSource。然后,您可以向方法 DoListen(CancellationToken token).

提供取消令牌 (cts.Token)

在 DoListen 中使用 属性 IsCancellationRequested 检查 while 循环中的取消,并使用 AcceptAsync(CancellationToken) 方法将令牌传递给 Socket。