关闭关联的套接字后取消监听任务
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。
我有一个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。