我使用VS2012作为我的项目,我正在处理Socket异常,当服务器无法向目标机器发送消息但它发生的时候它无法发送msg(我已经把它放在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 :(得分:1)
从一个线程到另一个线程没有神奇的编组异常。甚至几乎保证senderThread.Start();
之后的代码将在线程委托中的代码之前执行。
传递给Thread
构造函数的函数成为新线程的顶级函数。如果此类函数抛出异常(与您一样),则此异常将转到AppDomain.UnhandledException
事件,并且通常会终止应用程序。
您的选择
async
请注意,只有代码的同步版本才能以您希望的方式工作,所有其他使用多个线程的人都无法将异常返回到同一个“父函数”(使用async
至少会允许您代码看起来你想要的方式,即使它不会以相同的方式工作)。
答案 1 :(得分:0)
这只是一个猜测,但我相信你应该只在父函数中放置一个Try / Catch,而不是在子函数中。发生异常时,它将显示在父方法中。编写它的方式将捕获子方法中的异常,它不会传递回父方法。