提问者:小点点

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


我有一个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()启动的任务?
通过使循环条件监听,我可以确保任务将在条件评估时停止。
然而,这只会发生在接受新连接之后。
我如何摆脱等待var等待_socket。接受Async()。配置等待(false);?如果关联的套接字在等待AcceptAsync()时关闭,会发生什么?谢谢你的回答!


共1个答案

匿名用户

使用C的令牌源。然后可以提供取消令牌(cts.Token)到方法DoListing(取消令牌令牌)。

在DoList1中,使用属性IsCenseationReporttedSocket检查同时循环中的取消,并使用AcceptAsync(CenseationToken)方法将令牌传递给Socket。