日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

使用Task.Wait和Cancel解決Remoting超時(shí)Timeout

系統(tǒng) 2186 0

Remoting 客戶端用 TcpChannel 鏈接服務(wù)端的時(shí)候,如果地址不存在會(huì)嘗試連接到超時(shí)Timeout大概21秒左右,例如連接到"tcp:// 192.192.192.192 :8080/ServerObject"這個(gè)不存在的Remoting service地址。如何才能縮短這個(gè) Remoting 超時(shí)Timeout的時(shí)間呢?根據(jù) MSDN Channel Properties 說明: 默認(rèn)的timeout設(shè)置 是infinite(無限),默認(rèn)失敗嘗試次數(shù)/retryCount是一次。所以很自然,設(shè)置 Remoting 客戶端用 TcpChannel 鏈接服務(wù)端的連接超時(shí)timeout在timeout參數(shù)里面,代碼是這樣的:

使用Task.Wait和Cancel解決Remoting超時(shí)Timeout問題_第1張圖片

接下來的代碼就是調(diào)用instance的方法(IMyServiceContract里面定義的)。

可是測試發(fā)現(xiàn)設(shè)置的timeout參數(shù)沒起作用,超時(shí)還是21秒。

后來網(wǎng)上搜了一下,的確這是個(gè)普遍的問題,看看 這個(gè) 這個(gè) 帖子,但可惜都沒有解決我的問題。網(wǎng)上都沒有好的辦法,無奈我只好自己搞定了。用.NET 4.0 TPL里面的 Task.Wait(timeSpan) 和cancel搞定。

使用Task.Wait和Cancel解決Remoting超時(shí)Timeout問題

先看看下面的代碼:

使用Task.Wait和Cancel解決Remoting超時(shí)Timeout問題_第2張圖片

我想你一定看懂了,意思就是,線程池啟動(dòng)一個(gè)線程,做一些事情(這里假設(shè)耗時(shí)4秒),但必須在超時(shí)時(shí)間timeout時(shí)間內(nèi)(這里是3秒)內(nèi)完成,timeout時(shí)間到了就取消該線程任務(wù),并返回false。如果操作在3秒內(nèi)完成了,那么久返回true。很簡單吧。

:這里用了 CancelationTokenSource.Cancel ()來取消線程任務(wù),并且結(jié)合TPL里面的 Task.Wait(timeSpan) ,這樣實(shí)現(xiàn)timeout時(shí)間到了就取消該線程任務(wù)。請參考MSDN: Task Cancelation How to: Cancel a Task and Its Children . 細(xì)節(jié):如果僅僅調(diào)用bool Wait(TimeSpan timeout),時(shí)間到了并不會(huì)停止任務(wù)執(zhí)行,而是等待任務(wù)執(zhí)行完成,看所用時(shí)間如果超過timespan就返回false,否則返回true。)

這個(gè)方法就是用來測試一個(gè)遠(yuǎn)程地址是否可用,比如連接到"tcp:// 192.192.192.192 :8080/ServerObject"這個(gè)不存在的Remoting service地址,如果能在timeout時(shí)間內(nèi)(例如3秒內(nèi))返回,那么測試成功。超過就是失敗的服務(wù)端地址。可以在上面do some task的地方放置你的耗時(shí)操作,例如 Activator.GetObject 或者 instance.dosomething() - 一定要用try-catch括起來哦。

需要注意ChannelServices.UnRegisterChannel

有一點(diǎn)需要注意 ChannelServices.UnregisterChannel ,如果放在try-catch的那個(gè)block里面的話可能不工作,沒有效果,看下面的代碼:

使用Task.Wait和Cancel解決Remoting超時(shí)Timeout問題_第3張圖片

原因是如果連接到"tcp:// 192.192.192.192 :8080/ServerObject"這個(gè)不存在的Remoting service地址,可能會(huì)在Activator.GetObject 或者 instance.dosomething()這一步出現(xiàn)connection failed的異常,提示遠(yuǎn)程remoting服務(wù)器連接不上,然后就走到catch里面調(diào)用了 ChannelServices.UnregisterChannel 了嗎?沒有,還有retryCount,失敗重試,所以實(shí)際并沒有執(zhí)行注銷channel。

正確的解決方法是在其他地方,或者過一會(huì)兒再調(diào)用 ChannelServices.UnregisterChannel 。或者在我上述的函數(shù)測試一個(gè)遠(yuǎn)程地址是否可用TestRemotingServerAddress調(diào)用完成以后,如果是false,就調(diào) ChannelServices.UnregisterChannel 。此外,如果endpoint地址改變了,需要調(diào)用 ChannelServices.UnregisterChannel ,否則會(huì)發(fā)生異常。

使用Task.Wait和Cancel解決Remoting超時(shí)Timeout問題


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會(huì)非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 台州市| 通化市| 大冶市| 绍兴市| 北海市| 霍山县| 慈利县| 龙川县| 宝清县| 芮城县| 阿拉尔市| 犍为县| 东乡县| 铁岭市| 天柱县| 东海县| 琼结县| 昔阳县| 开阳县| 喀什市| 子洲县| 顺义区| 肥城市| 安康市| 宾川县| 仙居县| 双鸭山市| 渭南市| 永胜县| 进贤县| 当涂县| 凉城县| 庄河市| 肃北| 峨边| 桂东县| 锡林浩特市| 东辽县| 弥勒县| 苍山县| 汪清县|