通常在.net中注册事件时,最好在不再需要对象时注销它们以避免内存泄漏。
使用TransactionScope的TransactionCompleted事件是什么情况?
请考虑以下代码段:
using (var scope = new TransactionScope(TransactionScopeOption.Required))
{
Transaction.Current.TransactionCompleted += OnTransactionCompleted;
// do something
scope.Complete();
}
我应该在什么时候注销“交易完成”'事件,
如果我在using语句的末尾执行此操作,那么可以保证事件处理程序已经执行了吗?
其他选项是在事件处理程序本身取消注册,但我不确定另一个TransactionScope是否会在此之前开始使用。
什么时候提交TransactionCompleted事件?我可以确定当范围对象完成处理时会引发它吗? (保留'使用'块)
我在MSDN document和source code中都没有看到对此的任何引用。
答案 0 :(得分:1)
如果我在using语句的末尾执行此操作,则可以保证 事件处理程序已经执行了吗?
不,因为它可能是嵌套范围。一次只有一个事务处于活动状态,它由最外层的范围管理。
我可以确定当范围对象完成处理时会引发它吗?
出于同样的原因,没有。它是在事务提交时引发的,通常是在最外层范围被处理时。
您不需要取消注册事件处理程序,因为事务是不重用的短期对象。