1

我使用 Indy 的 TIdTCPServer(D2009,Indy 10)与客户端应用程序进行通信。在 OnExecute 方法中,我创建了一个任务并将其排队。工作线程执行任务并将其放入发送队列。然后发送队列将响应发送给客户端。

在发送线程中,我遍历服务器的上下文列表并查找与存储在任务中的 IP 和端口信息匹配的上下文。然后遵循一些有时会引发访问冲突的发送命令(我猜上下文在发送过程中被破坏)。

现在问题是:如何确保在发送响应之前上下文没有关闭?Indy 是否可以从单独的线程发送,或者一切都应该在 Indy 线程中完成?

4

1 回答 1

2

您可以尝试在发送数据时保持 TIdTCPServer.Contexts 列表锁定,因为上下文在从列表中删除之前不会被释放。缺点是在一个发送正在进行时不会处理任何客户端连接/断开连接/发送。

或者,只需将您的发送代码包装在 try/except 块中并忽略可能发生的任何错误。

或者,如果您可以重新编写代码以将发送队列移动到 Context 本身,那将是最好的,是的。然后您的 OnExecute 事件处理程序可以定期检查队列并在可用时发送数据。这也将有助于提高性能,因为如果您同时为多个客户端准备好传出数据,则不再序列化您的发送。

于 2009-10-07T23:38:10.440 回答