0

我在我的项目中使用 VS2012,当服务器无法向目标机器发送消息时,我正在处理 Socket 异常,但是当它无法发送 msg(我已经把它放在 trycatch 中)时,调试器只是中断了 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());
}

这是我希望执行操作的另一个函数中的方法。

4

2 回答 2

1

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

您传递给Thread构造函数的函数成为新线程上的顶级函数。如果这样的函数抛出异常(就像你做的那样),这个异常将进入AppDomain.UnhandledException事件并且通常终止应用程序。

您的选择

  • 恢复为同步代码(一个线程上的所有代码)
  • 使用现有的异步方法来通知您的代码操作结束。根据方法通知可以通过事件(类似于WebClient.DownloadStringAsync)或通过回调和调用 EndXXXXX (如 Socket.BeginSend)
  • 利用async
  • 手动实现对原始线程的同步和编组异常。

请注意,只有同步版本的代码才能按照您想要的方式工作,所有其他使用多个线程的代码将无法将异常返回给同一个“父函数”(使用async至少可以让您的代码看起来像您想要的那样,即使它不会以相同的方式工作)。

于 2013-03-03T03:19:34.327 回答
0

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

于 2013-03-03T03:04:46.150 回答