2016-09-27 40 views
0

今天我遇到了Windows Service的一些問題。如果有任務試圖訪問不可用的WCF服務,則不會調用Windows服務的OnStop方法

服務本身一直工作良好超過一年,它的主要工作是爲TCP客戶端提供數據流。

不久前,我添加了對WCF服務的調用,以發送有關數據流的一些信息。

爲了防止這些WCF的嚴重影響已經存在的邏輯要求,我用

Task.Run(() => { 
    using(var proxy = new WCFProxy("configurationName")) 
    { 
     proxy.WCFClientMethod() 
    } 
}); 

這工作很好,但我注意到,窗口服務卡在停止狀態,如果我嘗試通過Services.msc以阻止它而遠程WCF服務不可用。

如果遠程WCF服務可用,或者在Windows服務停留在停止狀態期間變爲可用,則停止服務成功。

經過一番調試,我發現OnStop方法沒有被調用。

我在網上發現了幾篇關於OnStop方法的文章,直到ThreadPool中的所有任務都完成之後才被調用。但我不確定這是否與這個問題有關,主要是因爲ThreadPool中的AFAIK任務應該完成,不管它們是否爲faulted(EndpointNotFoundException)

我將不勝感激關於如何解決此問題的任何想法(使用線程代替Task.Run不是一個好的選擇,因爲有許多對WCF服務的調用並創建如此多的線程可能會導致性能問題)。

回答

0

剛剛解決了我的問題。

發現WCF調用阻塞ThreadPool 中的實際任務,導致OnStop方法的調用卡在隊列中。

我已經使WCF呼叫與async/await異步,現在一切都平穩運行。

相關問題