开放式连接 IdTCPServer.Active:= false; 使程序挂起。 如何终止所有活动连接并停止IdTCPServer? 我正在尝试执行以下操作:
dt.Rows[i]["ColumnName"].ToString();
dt.Rows[i][ColumnInteger].ToString();
答案 0 :(得分:2)
打开连接时,IdTCPServer.Active:= false;导致程序挂起。
唯一的可能方法是死锁服务器。
如果您在服务器的事件处理程序与主UI线程同时同步同步的同时从主UI线程的上下文中停用服务器(TIdSync
, TThread.Synchronize()
,SendMessage()
等。
如果您的客户端线程执行的操作不是线程安全的,例如在没有适当同步的情况下访问UI,也会发生这种情况。
停用服务器将关闭所有活动套接字,并等待其线程终止。但是,如果一个或多个客户端线程在主UI线程上等待被阻塞,或者在其他情况下被死锁,而主UI线程在等待服务器停用时被阻塞,则这是一个死锁,使程序挂起。 >
要解决此问题,您需要确保服务器代码是线程安全的,并且您必须:
使用异步同步(TIdNotify
,TThread.Queue()
,PostMessage()
等),这样客户端线程就不会在等待主UI线程时被阻塞
从辅助线程中停用服务器,以便主UI线程可以自由地正常处理同步请求。