Я использую Indy для связи по TCP (D2009, Indy 10).
После оценки клиентского запроса я хочу отправить ответ клиенту. Поэтому я сохраняю TIdContext, вот так (псевдокод)
procedure ConnectionManager.OnIncomingRequest (Context : TIdContext);
begin
Task := TTask.Create;
Task.Context := Context;
ThreadPool.AddTask (Task);
end;
procedure ThreadPool.Execute (Task : TTask);
begin
// Perform some computation
Context.Connection.IOHandler.Write ('Response');
end;
Но что, если клиент разорвет соединение где-то между запросом и ответом, готовым к отправке? Как я могу проверить, если контекст все еще действителен? Я пытался
if Assigned (Context) and Assigned (Context.Connection) and Context.Connection.Connected then
Context.Connection.IOHandler.Write ('Response');
но это не помогает. В некоторых случаях программа просто зависает, и если я приостанавливаю выполнение, я вижу, что текущая строка соответствует условиям if.
Что здесь происходит? Как я могу избежать попыток отправки с использованием разорванных соединений?