【问题标题】: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() 时关闭相关的套接字会发生什么? 感谢您的回答!

【问题讨论】:

    标签: c# sockets tcp


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-22
      • 2013-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多