在关闭其关联的套接字时取消侦听任务
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