今天我遇到了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服務的調用並創建如此多的線程可能會導致性能問題)。