Indy,发送线程和被破坏的上下文

时间:2009-10-07 10:01:54

标签: delphi tcp delphi-2009 indy

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

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

现在回答一个问题:在发送回复之前,如何确保上下文没有关闭? Indy可以从一个单独的线程发送,还是应该在Indy线程中完成所有工作?

1 个答案:

答案 0 :(得分:2)

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

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

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