我写了一个window应用程序,是关于网络方面的,开了发送/接收两个线程。但是接收线程无法通过thread.Abort()方法关闭,请问大家是否遇到同样的情况。接收线程代码如下:
private void RecvThread()
{
            socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPAddress serverIp = IPAddress.Parse("127.0.0.1");
            //获得SERVER端PORT
            IPEndPoint iep = new IPEndPoint(serverIp, 8890);
            //连接服务器端
            socket.Connect(iep);
            byte[] recvBytes = new byte[1024];
            while (true)
            {
                int i = socket.Receive(recvBytes, recvBytes.Length, 0);
                if (i == 0)
                {
                    break;
                }
            }
}

解决方案 »

  1.   

    如果我采用thread.Abort()方法得到的结果是:程序界面停止响应,我看线程无法正常关闭,一直在“socket.Receive”处阻塞了
      

  2.   

    如果你要访问的的数据是网页建议你使用httpwebrequest对象
    否则
    socket receive并不是阻塞了,而是在一直请求不存在的数据。在tcp/ip编程中要给一个报头告诉接收方消息到底有多长。
      

  3.   

    我访问的不是网页,而是远端服务器,我和对方保持一个"长连接",随时会有数据交换,因此我会一直receive socket数据。而我Abort的原因是:当我发现异常后需要关闭接收线程,请兄弟指教
      

  4.   

    贴出所有代码 
    namespace WindowsApplication2
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }        private Thread SendTread;
            private Socket socket;
            private void button1_Click(object sender, EventArgs e)
            {
                RecvTread = new Thread(new ThreadStart(RecvThread));
                RecvTread .Start();
            }        private void RecvThread()
            {
                
                socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                IPAddress serverIp = IPAddress.Parse("127.0.0.1");
                //获得SERVER端PORT
                IPEndPoint iep = new IPEndPoint(serverIp, 8890);
                //连接服务器端
                socket.Connect(iep);
                byte[] recvBytes = new byte[1024];
                while (true)
                {
                    int i = socket.Receive(recvBytes, recvBytes.Length, 0);
                    if (i <= 0)
                    {
                        MessageBox.Show("exit");
                        break;
                    }
                }
                        }        private void button2_Click(object sender, EventArgs e)
            {
                try
                {
                    SendTread.Abort();
                    SendTread.Join();
                }
                catch(Exception b)
                {
                    MessageBox.Show(b.ToString());
                }
            }
        }
    }
      

  5.   

    private void m_btnConnect_Click(object sender, System.EventArgs e)
    {
    try
    {
                        int p=Convert.ToInt32(textBox1.Text);
    m_sock = new Socket( AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp );
    IPEndPoint epServer = new IPEndPoint(  IPAddress.Parse( m_tbServerAddress.Text ), p );
    m_sock.Connect(epServer);
    statusBar1.Text="已连接";
     thread=new Thread(new  ThreadStart(receive));
    thread.IsBackground=true;
    thread.Start(); }
    catch( Exception ex )
    {
    MessageBox.Show( this, ex.Message, "Server Connect failed!" );
    } }public void  receive()
    {
    try
    {
    while (true) 
    {
    byte[] bytes = new byte[1024];
    int bytesRec = m_sock.Receive(bytes);
    if(bytesRec>0)
    {
    string data = System.Text.Encoding.ASCII.GetString(bytes,0,bytesRec);
    Invoke( m_AddMessage, new string [] { data } );   //触发事件,显示消息内容
                            
    }
    }
    }           
    catch (System.Net.Sockets.SocketException  e)
    {  //关闭连接触发此异常
    string s=e.ToString();
    statusBar1.Text="断开连接";

    }

    }
      

  6.   

    楼上的和我程序基本一致,但没涉及到我探讨的内容,我是问thread.abort无法终止接收线程的解决方法
      

  7.   

    private void btnclose_Click(object sender, System.EventArgs e)
    {
    try  
    {
    if( m_sock != null  )
    {

    m_sock.Close();

    }
    if(thread!=null)
    {
    thread.Abort();
    thread=null;
    }
    catch{}
        
    }
      

  8.   

    RecvThread() 方法里,你捕捉SocketException了吗
      

  9.   

    我倒是怀疑你的方法中有没有把接收线程真的关闭掉,你可验证下:
    private   void   btnclose_Click(object   sender,   System.EventArgs   e) 

    try     

    if(   m_sock   !=   null     ) 
    { m_sock.Close(); } 
    if(thread!=null) 

    thread.Abort(); 
    thread.Join();
    thread=null; 

    catch{} 
            

     
     
      

  10.   

    加上一个join的阻塞,看看是否一直等待关闭线程响应,如果是,那么你和我一样,只是发送了终止线程的请求,而并未真的终止成功,你还可以这样校验:
      

  11.   

    LZ和我以前遇到的问题一样。
    因为socket没有被关闭,所以Thread是不会被abort的,thread的状态会变为System.Threading.ThreadState.Background | System.Threading.ThreadState.AbortRequested因此,你要做的是先关闭这个Thread里的socket,再abort这个thread即可。
      

  12.   

    楼主的代码里我怎么没有看到RecvTread 的定义呢?倒是看到了SendTread,你真的把代码发全了?
      

  13.   

    楼主的代码中存在问题就是socket的Receive一直阻塞等待数据的达来,应该先把socket进行关闭,让Receive过程出现异常,然后通过捕获异常关闭thread
      

  14.   

    其实liuys00的回答也应该得分的
      

  15.   

    thread.Abort()
    这个方法会引发一个ERROR的,你要注意处理!
    另外如果SOCET没有关闭,关闭不了,它会在后台等关闭。