2013-03-03 87 views
0

我使用VS2012为我的项目,我正在处理的Socket异常,当服务器无法发送消息到目标机器但它会发生,当它不能发送味精(我已经把它放在trycatch)调试器只是在catch块中断,并说错误而不发送给父catch块。请告诉我,如果我做错了什么。异常不会抛出父功能

private void sendMessageToTarget(string Message, IPAddress targetAddress, int port) 
    { 
     TcpClient client = new TcpClient(); 
     IPEndPoint server = new IPEndPoint(targetAddress, OUT_MESSAGE_PORT); 
     Thread senderThread = new Thread(new ThreadStart(delegate() 
     { 
      try 
      { 
       client.Connect(server); 
       MemoryStream memstream = new MemoryStream(); 
       NetworkStream netstream = client.GetStream(); 
       byte[] sentString = Encoding.ASCII.GetBytes(Message); 
       netstream.Write(sentString, 0, sentString.Length); 
       memstream.Close(); 
       netstream.Close(); 
       client.Close(); 
      } 
      catch (SocketException ex) 
      { 
       throw; 
      } 
     })); 
     senderThread.Start(); 
    } // Sending Message Method 

以上是我对发短信代码到目标

try 
{ 
     sendMessageToTarget("CONN_CHECKER", target, OUT_MESSAGE_PORT); 
} 
catch (Exception se) 
{ 
     ConnectedUsers.Remove(target.ToString()); 
     UpdateConnectedUserToTeacher(); 
     if (NeedFollowStudents.Contains(target.ToString())) 
     { 
      NeedFollowStudents.Remove(target.ToString()); 
     } 
     UserLostConnection(this, new EventArgs()); 
} 

这是我要执行的动作的另一功能的方法。

回答

0

这只是一个猜测,但我相信你应该只将一个Try/Catch放在父函数中,而不是放在孩子身上。发生异常时,将显示在父方法中。你写它的方式会捕获子方法中的异常,并且不会传递回父方法。

+0

我试图做到这一点,但调试器刚停止在线>>>> client.Connect(server); – tpeodndyy 2013-03-03 03:10:20

1

从一个线程到另一个线程不存在神奇的编组异常。它甚至是几乎保证senderThread.Start();之后的代码将在线程委托中的代码之前执行。

您传递给Thread构造函数的函数将成为新线程的顶级函数。如果这样的函数抛出异常(和你一样),这个异常将会发生到AppDomain.UnhandledException事件,并且通常会终止应用程序。

你选择

  • 回复到同步码(在一个线程中的所有代码)
  • 利用现有asynchrnous方法,将通知有关操作的结束你的代码。根据接近通知可以是通过事件(类似于WebClient.DownloadStringAsync),或通过回调,并呼吁EndXXXXX像Socket.BeginSend
  • 使用async
  • 手动实现同步和编组例外原来的线程。

请注意,只有代码的同步版本一定会给你想要的方式,所有其他使用多线程将无法返回例外相同的“父函数”(使用async将至少让你的代码看看你想要的方式,即使它不会以相同的方式工作)。

+0

我会尝试这些,希望它的作品。 Thx很多=) – tpeodndyy 2013-03-03 08:01:45