我有一個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()什么?感謝您的回答!
uj5u.com熱心網友回復:
使用 CancellationTokenSource。然后,您可以向 DoListen(CancellationToken token) 方法提供取消令牌 (cts.Token)。
在 DoListen 中,使用 IsCancellationRequested 屬性檢查 while 回圈中的取消,并使用 AcceptAsync(CancellationToken) 方法將令牌傳遞給 Socket。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/387195.html
上一篇:發送廣播訊息時的奇怪行為
