2014-02-12 81 views
1

在WCF頻道上調用Dispose()有時會阻塞一分鐘,直到產生一個TimeoutException。這似乎是一般情況下,如果服務器已經從其終端已經拆除了頻道。減少WCF通道的超時時間處理呼叫?

由於我們正在嘗試處理通道,並且通常在通道已從另一端拆除時發生這種情況,是否可以減少用於調用Dispose()的超時時間?

+0

爲什麼不把它放在工作線程上,讓它做它的事情? – PoweredByOrange

+0

我這樣做,並且可能無論如何,但取決於正在執行的呼叫數量,可以是大量的線程。 – dlanod

回答

0

在WCF通道調用Dispose()有時會阻塞一分鐘 ,直到引發TimeoutException。這似乎通常是如果 服務器已經從其終端已經拆除了通道。

並不總是如此。根據您的渠道管理的綁定情況,您無法關閉/處理渠道,直到服務處理完成。

有一篇珍貴的文章here解釋了爲什麼單向通話並不總是單向的,也就是爲什麼關閉通道可以阻止。這可以幫助您選擇另一個綁定配置。

因爲我們正在努力處理通道,並給予這通常當信道已經從另一端 推倒 發生,是有可能減少超時用於 處置期()調用?

這可以通過客戶端配置文件中的客戶端超時設置進行管理。有四個設置(打開,發送,接收&關閉)。這取決於你的約束力,但大體是這樣的(1分這裏):

<binding openTimeout="00:01:00" 
      closeTimeout="00:01:00" 
      sendTimeout="00:01:00" 
      receiveTimeout="00:01:00"> 
</binding> 

這裏是處理:在WCF客戶端此時間後拋出TimeoutExceptions時請求處理髮生在服務1分30。

調用Dispose或Close幾乎是相同的,並會嘗試關閉該頻道。您必須非常瞭解Dispose/Close問題:關閉頻道可能會引發異常,導致頻道保持打開狀態。閱讀的方式來避免這here

我也很好奇爲什麼在你的上下文中調用Dispose需要60秒。這表明在您的WCF實現中某些內容無效。