2014-04-06 112 views
1

通常,在.net中註冊事件時,當不再需要對象以避免內存泄漏時,取消註冊它們是一種很好的做法。我應該從TransactionScope TransactionCompleted事件註銷嗎?

使用TransactionScope的TransactionCompleted事件是什麼情況?

考慮下面的代碼片段:

using (var scope = new TransactionScope(TransactionScopeOption.Required)) 
{ 
    Transaction.Current.TransactionCompleted += OnTransactionCompleted; 

    // do something 

    scope.Complete(); 
} 

展望時,我應該註銷「TransactionCompleted」事件,

如果我這樣做是在using語句的結束,這是保證該事件處理程序已執行?

其他選項是在事件處理程序本身取消註冊,但我不確定另一個TransactionScope在此之前不會啓動。

什麼時候提交TransactionCompleted事件?我可以肯定,當物鏡對象完成處置後它會被擡起嗎? (離開'使用'塊)

我沒有在MSDN documentsource code中看到任何對此的引用。

回答

1

如果我這樣做是在using語句的結束,可以保證 事件處理程序已經執行?

不,因爲它可能是一個嵌套的作用域。一次只有一個事務處於活動狀態,並由最外層的範圍管理。

我可以肯定,當範圍對象完成處置時它會被擡起嗎?

出於同樣的原因,沒有。當事務提交時,通常在最外層範圍處理時提交。

您不需要註銷事件處理程序,因爲事務是不被重用的短期對象。