在我的Azure角色啓動代碼中,我實例化了一個DCOM對象,以確保它可以實例化,然後立即釋放它,因爲在那時我並不需要它。在縮放Azure角色時,實例化DCOM對象有時會掛起
我這樣做,在一個單獨的線程實際new
S中的相應的C#RCW類和主線程Thread.Join()
s的一個30秒的超時該線程。如果線程在Thread.Join()
返回後仍然運行,則意味着DCOM對象花費很長時間創建,因此調用Thread.Abort()
並重新啓動角色。 30秒應該足夠了 - 該對象是輕量級的,並且在實例化時不會耗費任何時間。
該代碼工作得很好,直到我試圖大幅度擴展我的服務。我要求支持解除計算核心配額並嘗試擴展到100個(100個)實例。
現在大多數實例都開始正常工作,但其中一些實際上面臨上述情況 - DCOM對象創建時間過長,代碼拋出異常,導致角色重新啓動。
我重複了幾次測試。一旦我要求擴大幾十個實例,問題就會在一些新開始的實例中被複制。由於所有的實例是統一的,我不知道是什麼可能導致這種行爲。
什麼可能是DCOM對象在某些情況下花費這麼長時間的原因?
您可能需要共享更多,但這聽起來像是一種競爭條件(或其他類型的計時錯誤)。您運行的實例越多,您在代碼中遇到競爭條件的機會就越大。我不希望它是關於「一些實例」,而是關於「有時我執行此代碼」。 – smarx
@smarx:看起來像一般的「一切都很好」的條件 - 我已經添加了一個答案。 – sharptooth