我应该从TransactionScope TransactionCompleted事件中取消注册吗?

时间:2014-04-06 16:33:09

标签: c# .net memory-management

通常在.net中注册事件时,最好在不再需要对象时注销它们以避免内存泄漏。

使用TransactionScope的TransactionCompleted事件是什么情况?

请考虑以下代码段:

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

    // do something

    scope.Complete();
}

我应该在什么时候注销“交易完成”'事件,

如果我在using语句的末尾执行此操作,那么可以保证事件处理程序已经执行了吗?

其他选项是在事件处理程序本身取消注册,但我不确定另一个TransactionScope是否会在此之前开始使用。

什么时候提交TransactionCompleted事件?我可以确定当范围对象完成处理时会引发它吗? (保留'使用'块)

我在MSDN documentsource code中都没有看到对此的任何引用。

1 个答案:

答案 0 :(得分:1)

  

如果我在using语句的末尾执行此操作,则可以保证   事件处理程序已经执行了吗?

不,因为它可能是嵌套范围。一次只有一个事务处于活动状态,它由最外层的范围管理。

  

我可以确定当范围对象完成处理时会引发它吗?

出于同样的原因,没有。它是在事务提交时引发的,通常是在最外层范围被处理时。

您不需要取消注册事件处理程序,因为事务是不重用的短期对象。