none
c# winform 一个客户端连接服务器端无响应的问题? RRS feed

  • 问题

  • 我就是问下一般什么情况下会出现这样的情况:

    我有一个客户端和服务端的程序,1.分别在本地,2.或者各自在不同的机器上运行都是可以连接的!

    问题就是第2种情况:当我把它们各自放在不同的机器上的时候。客户端点连接按钮,前几次都能连接成功。关闭连接后,再次点击连接的时候,就会出现程序未响应的现象。程序一直等待响应,出现假死。

    这时候只有把服务器上的程序关闭后再次开启,客户端才能连接上!  不知道这种情况一般是怎么引起的,要怎么解决呢?


    loveym
    2010年7月22日 7:14

答案

  • 查MSDN,其中明确说明:

    ThreadAbortException   类
    在对   Abort   方法进行调用时引发的异常。无法继承此类。
    备注
    在调用   Abort   方法以销毁线程时,公共语言运行库将引发   ThreadAbortException。ThreadAbortException   是一种可捕获的特殊异常,但在   catch   块的结尾处它将自动被再次引发。引发此异常时,运行库将在取消线程前执行所有   finally   块。由于线程可以在   finally   块中进行未绑定的计算,因此必须调用   Join   方法以保证线程已死亡。Join   是一个阻塞调用,它要到线程实际停止执行后才返回。

    不知道你用过Join方法吗?假如是这样的:

    try
    {
    //开始线程
    ThreadStart   LvThreadStart=new   ThreadStart(FShowPgb);
    MvThread=new   Thread(LvThreadStart);
    MvThread.Start();
    .......
    .......
    MvThread.Abort();
    MvThread.Join();
              //请对调这两句话
    }
    catch(ThreadAbortException   ex)
    {
              MessageBox.Show( "ok "+ex.Message);
    }

    2010年7月23日 2:55
    版主

全部回复

  • 你好,

    这种情况的出现,最常见的问题是你在服务端的握手还没有结束导致服务端程序没有响应。你应该检查一下你的服务端程序断开连接的代码以确定socket是否正常关闭及资源是否被释放。

    希望对你有所帮助。

    2010年7月22日 7:26
  • 谢谢楼上!

    另外,我在服务端开启监听。每次有客户端连接到服务端时,服务端都会开启一个独立线程与其通信。

    #region 启动相应的与客户端通信的线程
         clientThread = new Thread(new ParameterizedThreadStart(Receive_Process));
         clientThread.Start(ID);
    #endregion

    --------------------------------------------------------------------------------------------------

    问题是:当相应的此用户退出时,服务端如何断开与其对应的线程?是用这个么?

    Thread.CurrentThread.Abort();  (该语句我使用的时候会出现 ‘system.threading.threadAbortException:正在中止线程’ 的错误)


    loveym
    2010年7月23日 1:52
  • 查MSDN,其中明确说明:

    ThreadAbortException   类
    在对   Abort   方法进行调用时引发的异常。无法继承此类。
    备注
    在调用   Abort   方法以销毁线程时,公共语言运行库将引发   ThreadAbortException。ThreadAbortException   是一种可捕获的特殊异常,但在   catch   块的结尾处它将自动被再次引发。引发此异常时,运行库将在取消线程前执行所有   finally   块。由于线程可以在   finally   块中进行未绑定的计算,因此必须调用   Join   方法以保证线程已死亡。Join   是一个阻塞调用,它要到线程实际停止执行后才返回。

    不知道你用过Join方法吗?假如是这样的:

    try
    {
    //开始线程
    ThreadStart   LvThreadStart=new   ThreadStart(FShowPgb);
    MvThread=new   Thread(LvThreadStart);
    MvThread.Start();
    .......
    .......
    MvThread.Abort();
    MvThread.Join();
              //请对调这两句话
    }
    catch(ThreadAbortException   ex)
    {
              MessageBox.Show( "ok "+ex.Message);
    }

    2010年7月23日 2:55
    版主