razanpaul
譯者:todd wei
原文:您可能注意到了,.net的system.net.sockets.tcpclient和system.net.sockets.socket都沒有直接為connect/beginconnect提供超時控制機制。因此,當伺服器未處於監聽狀態,或者發生網路故障時,客戶端連線請求會被迫等待很長一段時間,直到丟擲異常。預設的等待時間長達20~30s。.net socket庫的socketoptionname.sendtimeout提供了控制傳送資料的超時時間,但並非本文討論的連線請求的超時時間。
這個問題最初源於我的某個專案,在解決以後,我曾將關鍵**發表在自己的部落格上。我注意到不少人對此表示感謝,所以我想這是乙個常見的問題,或許很多人都需要解決它。
下面是實現的關鍵**:
class
timeoutsocket
else
}else
}private
static
void
callbackmethod(iasyncresult asyncresult)
}catch
(exception ex)
finally}}
這裡,manualresetevent的waitone(timespan, boolean)起到了主要的作用。它將阻止當前執行緒,直到manualresetevent物件被set或者超過timeout時間。上面的**中,呼叫beginconnect後通過waitone方法阻止當前執行緒,如果在timeoutmsec時間內連線成功,將在callbackmethod**中呼叫timeoutobject.set,解除被阻塞的連線線程並返回;否則,連線線程會在等待超時後,主動關閉連線並丟擲timeoutexception。
雖然實現非常簡單,但或許很多人都需要連線請求超時機制,如果有任何問題,我會盡力為您解答。
作者介紹了一種非同步連線+waitone的連線請求超時機制。其中的實現細節有值得商榷的地方,比如:a.static成員帶來的執行緒安全性問題;b.可以考慮利用iasyncresult.asyncwaithandle,不必另行建立manualresetevent。但瑕不掩瑜,感謝作者的解決思路。
android 請求超時的原因 客戶端超時機制
近日生產系統很不穩定,白天也會堵塞請求,系統無法響應客戶請求。分析後多數是外圍系統堵塞引起的。crm依賴的系統太多,我們只做業務受理,客戶接觸相關業務。幾乎每個客戶請求都會呼叫外圍系統介面,如果外系統堵塞,我們系統就會堵塞,我們是和客戶互動的,客戶第乙個找的就是我們。我們得要給出答覆,分析的原因。為...
如何控制C Socket的連線超時時間
最近在socket程式設計的時候發現只能設定send和recieve的timeout時間,而connect方法的timeout是固定的,大概有30 40s,如果用同步方法介面會卡死很長時間 下面介紹兩種通過非同步的方式解決此問題的方法 1.使用beginconnect方法 iasyncresult ...
CXF 連線超時與請求超時的設定
主要在客戶端呼叫時設定 在編譯 執行是沒問題的,但測試發現如果服務端沒有啟動或網路環境差,cxf會預設等待一定的時間 則有了客戶端呼叫超時的設定 方式 1 在 中設定超時 這是命令生成的類,該類的例項可當成工廠來使用 cxfetcvremindinfoserviceimpl factory new ...