В чем собственно проблема? Когда вы закрываете сервер, предполагается , чтобы активные операции чтения / записи вызывали исключение. Это нормальное поведение для Инди. ReadLn()
с такой же вероятностью вызовет исключение, как и ReadLnSplit()
. Indy полагается на исключения для своих внутренних уведомлений. Просто позвольте серверу обработать исключение для вас, чтобы он мог завершить и очистить поток, управляющий TIdContext
и его соединением. Исключение составляет контекст этого потока, остальная часть вашего кода (или ваши пользователи) его не увидят.
Единственное, что ReadLnSplit()
делает иначе, чем ReadLn()
, - это заставляет свойство MaxLineAction
IOHandler равным maSplit
во время этого вызова, и ничего больше. Единственная причина использования ReadLnSplit()
заключается в обработке строк, которые длиннее свойства MaxLineLength
IOHandler, без изменения MaxLineLength
. Если вам не нравится, как ведет себя ReadLnSplit()
, не используйте его. Вы можете просто увеличить значение свойства MaxLineLength
IOHandler и вместо этого вызвать ReadLn()
:
AContext.Connection.IOHandler.MaxLineLength := MaxInt;
cl3 := AContext.Connection.IOHandler.ReadLn(#0, IndyUTF8Encoding);
Или вы можете вызвать перегруженную версию ReadLn()
с необязательным параметром AMaxLineLength
:
cl3 := AContext.Connection.IOHandler.ReadLn(#0, IdTimeoutDefault, MaxInt, IndyUTF8Encoding);