2016-08-18 32 views
1

什麼是從外部破壞TIdContext後裔的正確方法印語境?我想關閉一個特定的(掛起)連接並摧毀它的上下文。銷燬從外面

說,我從TIdCustomTCPServer.Contexts和...採取一個元素,並調用Free是不夠的我猜。我只是想避免任何陷阱。有時Indy根本不直觀。

+0

請勿使用蠻力。找出連接掛起的原因。它在無限循環中運行代碼嗎?它是否在等待從未到達的事件或數據? – mjn42

+0

@ mjn42我需要這個。相信我:) –

+1

我們不需要相信你。我們需要看你的實際代碼。 mjn42說的是正確的。你需要找到掛起的原因並修復它。如果你正確使用Indy,它不應該掛起。現在,可能你可能只是停留在「掛起」的阻塞讀/寫操作中,因爲客戶端沒有正確地做一些事情。這是一個不同的問題。 Indy使用阻塞套接字I/O,但它也支持超時,因此如果時間過長,您可以利用這些超時退出阻塞的I/O,然後可以在需要時關閉連接。 –

回答

2

你可能想使用這樣的事情。不釋放任何情況下

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; 
3

什麼是從外部破壞TIdContext後裔的正確方法?

要那麼做的。你不擁有上下文對象,你沒有業務摧毀它們。服務器擁有它們,它會爲你管理它們。

我想關閉一個特定的(懸掛)連接並銷燬它的上下文。

時,其擁有的線程終止上下文自動銷燬。默認情況下,該線程在關聯的套接字關閉時終止。確保您的事件處理程序不會阻止例外,除非您手動撥打Disconnect()

說,我正在從TIdCustomTCPServer.Contexts和...調用一個元素,我猜是不夠的。

請不要直接破壞語境。但是,您可以可以來代替Context.Connection.Disconnect()