我有一个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()
时关闭,会发生什么?谢谢你的回答!
使用C的令牌源。然后可以提供取消令牌(cts.Token)到方法DoListing(取消令牌令牌)。
在DoList1中,使用属性IsCenseationReporttedSocket检查同时循环中的取消,并使用AcceptAsync(CenseationToken)方法将令牌传递给Socket。