使用Task.Wait和Cancel解決Remoting逾時Timeout問題

來源:互聯網
上載者:User

在Remoting用戶端用TcpChannel連結服務端的時候,如果地址不存在會嘗試串連到逾時Timeout大概21秒左右,例如串連到"tcp://192.192.192.192:8080/ServerObject"這個不存在的Remoting service地址。如何才能縮短這個Remoting逾時Timeout的時間呢?根據MSDN Channel Properties說明:預設的timeout設定是infinite(無限),預設失敗嘗試次數/retryCount是一次。所以很自然,設定Remoting用戶端用TcpChannel連結服務端的連線逾時timeout在timeout參數裡面,代碼是這樣的:

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

可是測試發現設定的timeout參數沒起作用,逾時還是21秒。

後來網上搜了一下,的確這是個普遍的問題,看看這個和這個文章,但可惜都沒有解決我的問題。網上都沒有好的辦法,無奈我只好自己搞定了。用.NET 4.0 TPL裡面的Task.Wait(timeSpan)和cancel搞定。

使用Task.Wait和Cancel解決Remoting逾時Timeout問題

先看看下面的代碼:

我想你一定看懂了,意思就是,線程池啟動一個線程,做一些事情(這裡假設耗時4秒),但必須在逾時時間timeout時間內(這裡是3秒)內完成,timeout時間到了就取消該線程任務,並返回false。如果操作在3秒內完成了,那麼久返回true。很簡單吧。

:這裡用了CancelationTokenSource.Cancel()來取消線程任務,並且結合TPL裡面的Task.Wait(timeSpan),這樣實現timeout時間到了就取消該線程任務。請參考MSDN:Task Cancelation 和How to: Cancel a Task and Its Children. 細節:如果僅僅調用bool Wait(TimeSpan timeout),時間到了並不會停止任務執行,而是等待任務執行完成,看所用時間如果超過timespan就返回false,否則返回true。)

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

需要注意ChannelServices.UnRegisterChannel

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

原因是如果串連到"tcp://192.192.192.192:8080/ServerObject"這個不存在的Remoting service地址,可能會在Activator.GetObject 或者 instance.dosomething()這一步出現connection failed的異常,提示遠程remoting伺服器串連不上,然後就走到catch裡面調用了ChannelServices.UnregisterChannel了嗎?沒有,還有retryCount,失敗重試,所以實際並沒有執行登出channel。

正確的解決方案是在其他地方,或者過一會兒再調用ChannelServices.UnregisterChannel。或者在我上述的函數測試一個遠程地址是否可用TestRemotingServerAddress調用完成以後,如果是false,就調ChannelServices.UnregisterChannel。此外,如果endpoint地址改變了,需要調用ChannelServices.UnregisterChannel,否則會發生異常。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.