2016-03-01 31 views
0

我想跟蹤分佈式環境中類的實例(如Class1)的生命週期。例如。有一臺SQL Server計算機,並且有多個連接到該SQL Server計算機的IIS服務器。 IIS機器上有多個ASP.NET應用程序的實例(一臺機器上有一個實例)。在IDisposable.Dispose()中調用數據庫更新

隨着對任何IIS服務器上應用程序的任何實例的每個請求,將創建一個Class1的實例,並將創建時間記錄到數據庫中。我想知道什麼時候Class1的實例被銷燬。

那麼明智地讓Class1執行IDisposable並將銷燬時間記錄到Dispose()方法中的數據庫中?考慮到更新包含數百萬條記錄的表可能會耗費時間,並且這會迫使垃圾收集器在處理該對象實例時等待,我不知道該做什麼。

一般的問題是:

是否明智調用耗時的操作中的對象IDisposable.Dispose()時性能是非常重要的?

請幫我這個問題,

感謝

+1

爲什麼不在Dispose()調用期間將時間/對象信息發送到Queue。然後你可以有一個單獨的線程/進程消耗隊列到數據庫。會更有效率,並且不會混淆垃圾收集速度。 – Matt

+0

@Matt,你是對的!,好主意(異步調用在其他線程上更新數據庫),謝謝 – anonim

回答

0

如果您需要登錄它的東西,你可以做到這一點。不知道具體情況,很難說它將如何影響績效。

但是,這不會告訴你什麼時候該對象被銷燬。它只會告訴你何時調用Dispose方法。垃圾收集器可能無法在該時刻收集垃圾收集器。您可以給Class1一個終結器方法(即實現System.Object的Finalize方法),然後寫入日誌,但即使如此,該對象也不會在此時被銷燬,因爲垃圾回收器會調用終結器並在隨後的版本上銷燬該對象通過。這會增加更多的開銷。

既然你不能得到確切的銷燬點,你似乎只需要通過它的聲音來處理這個日誌的Dispose方法,那麼你可以放棄使用IDisposable。你可能只需要一個叫做Close()或者Finish()的方法,當你不再需要這個對象時,或者在它超出範圍之前調用它。如果Class1確實實現了IDisposable,那麼如果需要,可以在using塊中使用它,而不必擔心顯式調用Dispose方法。

+0

感謝您的關注 – anonim