2010-08-23 23 views
3

我有一個應用程序發送請求到一個處理請求並將它們發送回請求應用程序的proc COM服務器。COM服務器掛起檢測和解決

客戶端應用程序確實控制着這個Out-of-Proc COM服務器的啓動並確定了它的生命週期。

因爲這個應用程序在任何時候都有數百個請求,所以它大多至少有4個相同的COM服務器來處理這些請求。

問題是,有時候這個COM服務器會掛起處理一個請求,這個請求會被請求的應用程序捕獲,這個應用程序將殺死proc COM服務器。然而,這並不總是發生。

有時會發生的情況是,客戶端應用程序請求COM服務器kill,這會導致客戶端釋放對COM服務器的所有引用,但COM服務器最終只使用了25%的CPU,並且永遠不會死亡。它似乎只是掛起,並不斷使用CPU。

客戶端有機制試圖殺死COM服務器進程,如果它無法死亡,但是即使這似乎並沒有在COM服務器進入CPU使用情況並掛起的情況下工作。

有沒有人經歷過類似的事情或對如何解決這種情況有一些建議?

+0

同樣的問題http://stackoverflow.com/questions/10691592/how-to-call-release-from-com-server – 2012-08-14 19:23:51

回答

1

您需要在COM服務器中設計所有調用,使得它們在相當短的時間內全部結束。一旦新的呼叫從客戶端到達,COM產生一個單獨的線程並將調用分派到該線程中。沒有可靠的方法來中斷通話 - 通話需要自行結束(只是返回)。您可以通過適當地設計算法來實現這一點

+0

所以你說,COM proc掛起可能是因爲一個電話被中斷,現在不能結束本身是否正確,因爲客戶端已經斷開連接? – 2010-08-23 11:04:46

+0

@Tony:沒有,out-proc服務器掛起,因爲調用將控制權交給了一些沒有返回的代碼。你可以自己嘗試一下 - 在任何COM方法實現中添加一個無限循環,並從客戶端調用該方法。你可以殺死客戶端,但服務器至少會運行很長一段時間,我想它會永遠運行。 – sharptooth 2010-08-23 11:14:49

+0

好的,所以所有的COM調用都必須返回,才能殺死proc服務器。事情是,我還沒有看到一個地方,在我的proc服務器可能會發生無限循環,所以即使沒有這樣的循環,並且調用不返回,我們有問題嗎? – 2010-08-23 11:53:55