什麼是從外部破壞TIdContext
後裔的正確方法印語境?我想關閉一個特定的(掛起)連接並摧毀它的上下文。銷燬從外面
說,我從TIdCustomTCPServer.Contexts
和...採取一個元素,並調用Free
是不夠的我猜。我只是想避免任何陷阱。有時Indy根本不直觀。
什麼是從外部破壞TIdContext
後裔的正確方法印語境?我想關閉一個特定的(掛起)連接並摧毀它的上下文。銷燬從外面
說,我從TIdCustomTCPServer.Contexts
和...採取一個元素,並調用Free
是不夠的我猜。我只是想避免任何陷阱。有時Indy根本不直觀。
你可能想使用這樣的事情。不釋放任何情況下
var
i: Integer;
list: TList;
begin
list := IdTCPServer1.Contexts.LockList;
try
for i := 0 to list.Count-1 do
begin
try
TIdContext(list.Items[i]).Connection.Disconnect;
except
end;
end;
finally
IdTCPServer1.Contexts.UnlockList;
end;
end;
什麼是從外部破壞TIdContext後裔的正確方法?
要那麼做的。你不擁有上下文對象,你沒有業務摧毀它們。服務器擁有它們,它會爲你管理它們。
我想關閉一個特定的(懸掛)連接並銷燬它的上下文。
時,其擁有的線程終止上下文自動銷燬。默認情況下,該線程在關聯的套接字關閉時終止。確保您的事件處理程序不會阻止例外,除非您手動撥打Disconnect()
。
說,我正在從TIdCustomTCPServer.Contexts和...調用一個元素,我猜是不夠的。
請不要直接破壞語境。但是,您可以可以來代替Context.Connection.Disconnect()
。
請勿使用蠻力。找出連接掛起的原因。它在無限循環中運行代碼嗎?它是否在等待從未到達的事件或數據? – mjn42
@ mjn42我需要這個。相信我:) –
我們不需要相信你。我們需要看你的實際代碼。 mjn42說的是正確的。你需要找到掛起的原因並修復它。如果你正確使用Indy,它不應該掛起。現在,可能你可能只是停留在「掛起」的阻塞讀/寫操作中,因爲客戶端沒有正確地做一些事情。這是一個不同的問題。 Indy使用阻塞套接字I/O,但它也支持超時,因此如果時間過長,您可以利用這些超時退出阻塞的I/O,然後可以在需要時關閉連接。 –