首页 / C# / c# – 在引擎盖下的阻止任务中取消令牌
c# – 在引擎盖下的阻止任务中取消令牌
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 在引擎盖下的阻止任务中取消令牌,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1918字,纯文字阅读大概需要3分钟。
内容图文
![c# – 在引擎盖下的阻止任务中取消令牌](/upload/InfoBanner/zyjiaocheng/788/35c9aaedd5b542db83c64e75077f1d08.jpg)
我有两个按钮来启动和停止TcpListener.
private void buttonStartServer_Click(object sender, EventArgs e)
{
ThreadPool.SetMinThreads(50, 50);
IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
_listener = new TcpListener(ipAddress, 5000);
cancelSource = new CancellationTokenSource();
CancellationToken token = cancelSource.Token;
var taskListener = Task.Factory.StartNew(
(t) => Listener(token),token,TaskCreationOptions.LongRunning);
}
void Listener(CancellationToken token)
{
_listener.Start();
while (!token.IsCancellationRequested)
{
TcpClient c;
try
{
c = _listener.AcceptTcpClient();
}
catch
{
break;
}
Task t = Task.Factory.StartNew(() => Accept(c))
.ContinueWith(ant => richTextBoxMessage.AppendText(ant.Result), _uiScheduler);
}
}
private void buttonStopServer_Click(object sender, EventArgs e)
{
cancelSource.Cancel();
_listener.Stop();
richTextBoxMessage.AppendText("Server shutdown");
}
Accept是从TcpClient读取的一些方法.我的问题是,在我通过单击按钮停止服务器之前,我的服务器被阻止了
try {c = _listener.AcceptTcpClient();}
那么点击取消按钮如何杀死taskListener?没有ManualResetEvent或ManualResetEventSlim?我能够在服务器关闭和服务器重启之间切换.引擎盖下发生了什么?我的目标是.NET 4.0
解决方法:
So how does clicking the cancel button kill the taskListener?
在取消事件处理程序中调用TcpListener.Stop时,它将在内部关闭底层Socket,并引发SocketException. catch catch all阻止了这个异常,它只会破坏循环.
文档明确说明了这一点(强调我的):
Stop closes the listener. Any unaccepted connection requests in the
queue will be lost. Remote hosts waiting for a connection to be
accepted will throw a SocketException. You are responsible for closing
your accepted connections separately.
您可以通过在catch块中打印出异常来看到这一点:
TcpClient c;
try
{
c = _listener.AcceptTcpClient();
}
catch (SocketException e)
{
Debug.WriteLine("Socket exception was raised: {0}", e);
if (e.SocketErrorCode == SocketError.Interrupted)
Debug.WriteLine("Blocking listen was interrupted");
}
内容总结
以上是互联网集市为您收集整理的c# – 在引擎盖下的阻止任务中取消令牌全部内容,希望文章能够帮你解决c# – 在引擎盖下的阻止任务中取消令牌所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。