【发布时间】:2012-09-12 09:08:23
【问题描述】:
我正在查看一些不是我自己编写的代码,并试图了解导致应用程序崩溃的原因。
我认为这可能归结为它如何处理资源和管理线程。
主父线程创建一个新的应用层客户端(TCPMonitor),然后创建另一个处理 TCP 套接字通信的类(TCPListen)。此类产生一个新的线程循环,该循环创建一个新的 TCP 套接字客户端、该套接字上的读取网络流,然后调用同步阻塞 Read()。
但是,如果发生网络错误连接,则会在 TCPListen 线程循环中捕获异常,并将事件返回给所属类 TCPMonitor。 TCPMonitor 然后检查它是否拥有一个活动的 TCPListen 实例,如果是,它调用 Dispose() 并将该实例设置为 Null。
此时 TCPListen Read() 肯定仍处于阻塞调用中吗?如果是这种情况,如何确保从父线程调用 Dispose 将使子线程脱离阻塞调用并正确处理流和套接字?
【问题讨论】:
-
我认为
TCPListen仍然会在Read中被阻塞,如果有一个循环并且catch 块重新抛出异常但不退出循环。是这样吗? -
在读取完成后,套接字和流上的关闭方法周围有 try/catch 块,但它们不会被重新抛出。循环中的大多数代码也有更广泛的尝试/捕获,这也吞噬了错误。这会向父级引发一个事件,然后处理线程类。
标签: c# .net multithreading sockets