在窗体上有两个按钮,点击button1开启侦听,点击button2关闭侦听private void button1_Click(object sender, System.EventArgs e)
{
try
{
thread = new Thread(new ThreadStart(beginlisten)); thread.Start(); button1.Enabled = false;
button2.Enabled = true;
}
catch(Exception er)
{
MessageBox.Show(er.ToString());
}
}private void button2_Click(object sender, System.EventArgs e)
{
this.button1.Enabled = true;
this.button2.Enabled = false;try
{
tcpListener.Stop();thread.Abort();
}
catch(Exception ex)
{
Console.WriteLine(ex.InnerException.ToString());
}
} 线程中运行的代码部分如下:
while(true)
{
Console.Write("Waiting for a connection... ");
TcpClient client = tcpListener.AcceptTcpClient();
...
...
...
}>>>>>>>>请问为什么我关闭TcpListener的时候会引发下面的异常:System.Net.Socket.SocketException:一个封锁操作对WSACancelBlockingCall的调用中断
at System.Net.Sockets.Socket.Accept
at System.Net.Sockets.TcpListener.AcceptTcpClient那么点击button2时应该怎么样关闭TcpListener才是正确的呢???
{
try
{
thread = new Thread(new ThreadStart(beginlisten)); thread.Start(); button1.Enabled = false;
button2.Enabled = true;
}
catch(Exception er)
{
MessageBox.Show(er.ToString());
}
}private void button2_Click(object sender, System.EventArgs e)
{
this.button1.Enabled = true;
this.button2.Enabled = false;try
{
tcpListener.Stop();thread.Abort();
}
catch(Exception ex)
{
Console.WriteLine(ex.InnerException.ToString());
}
} 线程中运行的代码部分如下:
while(true)
{
Console.Write("Waiting for a connection... ");
TcpClient client = tcpListener.AcceptTcpClient();
...
...
...
}>>>>>>>>请问为什么我关闭TcpListener的时候会引发下面的异常:System.Net.Socket.SocketException:一个封锁操作对WSACancelBlockingCall的调用中断
at System.Net.Sockets.Socket.Accept
at System.Net.Sockets.TcpListener.AcceptTcpClient那么点击button2时应该怎么样关闭TcpListener才是正确的呢???
解决方案 »
- 怎么查看某进程对CPU,内存,网络流量的占用等信息
- C#反射问题,请高手指教
- 求助高手,怎样实现点击listbox中图片名 在 picturebox中显示图片
- 求教一个while语句
- c#控制台输入字符串
- 在派生类中重写 OnTextChanged 时,如何接收委托事件?
- 对话框上有20个textbox,5个一行,共4行,如何将每行的textbox.text作为记录插入5个字段的ACCESS数据库里去?
- 程序运行时无响应状态
- WCF如何能动态连接?
- 如何将大量数据分批提取进入DataSet?
- 未处理的“System.Security.SecurityException”类型的异常,见过这问题的朋友进来
- 一位电工通过自学学会了编程,当满怀信心去应聘的时候,发现我的能力超过了应聘毕业生,但输给了学历!
AcceptTcpClient 就会引发异常
这时候应该抓住它然后结束线程如果没有抓住,异常就会抛到CLR,因为在正在执行的线程里面没有catch
以 volatile 方式是定全局 bool 变数 run ,run 等于true 时 while, run 等于false while 退出。方法2:
while 里面放 try catch , 不能从TcpListener继续监听时退出。
以 volatile 方式是定全局 bool 变数 run ,run 等于true 时 while, run 等于false while 退出。”这个没用,因为:while (run) {
.... tcpListener.AcceptTcpClient(); // 这一句会一直阻塞(停在这里不动),直到接到一个TcpClient,或者出错,所以在 tcpListener 被 Close() 的时候,run 来不及再次判断就出错了线程内的代码应该这样写:try {
while(true) {
TcpClient client = tcpListener.AcceptTcpClient();
...
}
} catch (SocketException) { } // 在tcpListener被关之后就会到达这里,从而退出死循环
private bool blnStop = false;//in your thread function
while( !blnStop )//replace the previouse "while( true )"
{
//other operation here
}//Close thread
blnStop = true;
yourThread.Join();//Wait thread till its end
private void OnRecievedData( IAsyncResult ar )
{
Socket sock = (Socket)ar.AsyncState; try
{
int nBytesRec = sock.EndReceive( ar );
if( nBytesRec > 0 )
{
String responseData = String.Empty; responseData = System.Text.Encoding.Unicode.GetString(readBuffer, 0, nBytesRec); Console.WriteLine("Received: {0}", responseData); sock.BeginReceive(readBuffer, 0, readBuffer.Length, SocketFlags.None, recieveData, sock ); }
}如果窗体上有另一个按钮,点击它就会把Socket关闭:socket.Shutdown(SocketShutdown.Both);socket.Close();但总是会抛出异常:无法访问名为"System.Net.Sockets.Socket"的已处置对象。那可能是因为点击Button关闭socket的时候,Socket.BeginReceive()的回调方法中也正好在使用socket,所以出现了问题,那么应该怎么处置这个办法呢?因为OnRecievedData是在线程池里执行的,不能使用XXX.Abort()来停止
try { socket.Close(); } catch { }
socket = null;