我是否应该从事务范围事务已完成事件中注销

本文关键字:事务 已完成 事件 注销 范围 是否 | 更新日期: 2023-09-27 17:57:04

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

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

请考虑以下代码片段:

using (var scope = new TransactionScope(TransactionScopeOption.Required))
{
    Transaction.Current.TransactionCompleted += OnTransactionCompleted;
    // do something
    scope.Complete();
}

查看何时应取消注册"事务已完成"事件,

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

另一种选择是在事件处理程序本身取消注册,但我不确定在此之前另一个 TransactionScope 不会启动。

何时引发事务已完成事件?我能否确定在范围对象完成处置时会引发该事件?(离开"使用"块)

我在 MSDN 文档和源代码中都没有看到对此的任何引用。

我是否应该从事务范围事务已完成事件中注销

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

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

我能确定当范围对象完成处置时会引发它吗?

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

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