在关闭其关联的套接字时取消侦听任务

Posted

技术标签:

【中文标题】在关闭其关联的套接字时取消侦听任务【英文标题】:Cancel listening Task upon closing its associated socket 【发布时间】:2022-01-16 22:43:50 【问题描述】:

我有一个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() 时关闭相关的套接字会发生什么? 感谢您的回答!

【问题讨论】:

【参考方案1】:

使用 CancellationTokenSource。然后,您可以向 DoListen(CancellationToken token) 方法提供取消令牌 (cts.Token)。

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

【讨论】:

以上是关于在关闭其关联的套接字时取消侦听任务的主要内容,如果未能解决你的问题,请参考以下文章

在spring中获取websocket会话的关联HTTPSession

如何关闭在while循环中的线程中侦听的阻塞套接字?

套接字关闭时取消阻止 recvfrom

为啥 SO_RCVTIMEO 从侦听套接字继承到接受的套接字? [关闭]

远程登录我的套接字侦听端口正在关闭套接字

android - 如何运行2个套接字到同一个IP和端口?