我正在使用异步回调的 Windows 套接字应用程序。如果我使用 Thread 来启动_StartListening
,当我调用时StopListening
,循环仍然停止在allDone.WaitOne()
. 但Task版本就可以了。
有什么不同?
我的代码是这个的修改版本
原始版本有felix-bManualResetEvent
提到的竞争条件。我把它改成了,但问题仍然存在。SemaphoreSlim
我在调试模式下尝试过,即使我不启动客户端,if (cancelToken.IsCancellationRequested)
在我调用后似乎也不会遇到断点。StopListening
对不起。我发现我不小心启动了两个socket服务器。那就是问题所在。
class WinSocketServer:IDisposable
{
public SemaphoreSlim semaphore = new SemaphoreSlim(0);
private CancellationTokenSource cancelSource = new CancellationTokenSource();
public void AcceptCallback(IAsyncResult ar)
{
semaphore.Release();
//Do something
}
private void _StartListening(CancellationToken cancelToken)
{
try
{
while (true)
{
if (cancelToken.IsCancellationRequested)
break;
Console.WriteLine("Waiting for a connection...");
listener.BeginAccept(new AsyncCallback(AcceptCallback),listener);
semaphore.Wait();
}
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
Console.WriteLine("Complete");
}
public void StartListening()
{
Task.Run(() => _StartListening(cancelSource.Token));//OK
var t = new Thread(() => _StartListening(cancelSource.Token));
t.Start();//Can't be stopped by calling StopListening
}
public void StopListening()
{
listener.Close();
cancelSource.Cancel();
semaphore.Release();
}
public void Dispose()
{
StopListening();
cancelSource.Dispose();
semaphore.Dispose();
}
}
慕哥9229398
相关分类