加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – System.Transactions中的未处理异常在网络不稳定期间停止W

发布时间:2020-12-15 22:20:11 所属栏目:百科 来源:网络整理
导读:我们使用NServiceBus.Host.exe主机进程运行基于NServiceBus的服务. 在过去几个月中,Windows服务突然停止了两次生产,在应用程序事件日志中留下了以下事件: Application: NServiceBus.Host.exe Framework Version: v4.0.30319 Description: The process was t
我们使用NServiceBus.Host.exe主机进程运行基于NServiceBus的服务.

在过去几个月中,Windows服务突然停止了两次生产,在应用程序事件日志中留下了以下事件:

Application: NServiceBus.Host.exe
Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: System.InvalidOperationException
Stack:
at System.Transactions.TransactionState.ChangeStatePromotedPhase0(System.Transactions.InternalTransaction)
at System.Transactions.Phase0VolatileDemultiplexer.InternalPrepare()
at System.Transactions.VolatileDemultiplexer.PoolablePrepare(System.Object)
at System.Transactions.Oletx.OletxVolatileEnlistment.Prepare(System.Transactions.Oletx.OletxVolatileEnlistmentContainer)
at System.Transactions.Oletx.OletxPhase0VolatileEnlistmentContainer.Phase0Request(Boolean)
at System.Transactions.Oletx.OletxTransactionManager.ShimNotificationCallback(System.Object,Boolean)
at System.Threading._ThreadPoolWaitOrTimerCallback.PerformWaitOrTimerCallback(System.Object,Boolean)

我们在网络不稳定几分钟的时间段内遇到此错误(例如,针对数据库的大量超时,这些在我们的log4net日志文件中可见)

关于什么在这里失败的任何想法?

我们在log4net日志文件中看不到任何致命错误.

版本:

> Windows Server 2008 R2
> .NET Framework 4.5.2
> NServiceBus 4.7.5
> NHibernate 3.3.3.4001(用于传奇,订阅和超时持久性)
> SQL Server 2012

解决方法

看来你看到的行为与NHibernate如何处理 TransactionCompleted事件有关.这个问题也是某种方式 related to this question.

AdoNetWithDistributedTransactionFactory在TransactionCompleted事件上注册匿名委托.使用ThreadPool.QueueUserWorkItem在后台线程上触发此事件.如果该操作因数据库服务器的连接问题而引发异常(i.ex.由于网络分区),则此异常将作为AppDomain上的未观察异常引发. UnhandledExceptions会拆除AppDomain,因此也会拆除NServiceBus.Host.

最好的解决方法是在当前AppDomain上注册UnhandledException处理程序,如下所示

AppDomain.CurrentDomain.UnhandledException += OnUnhandledException

private static void OnUnhandledException(object sender,UnhandledExceptionEventArgs e)
{
    LogManager.GetLogger(typeof(AppDomain)).Fatal(“Unhandled exception”,e.ExceptionObject as Exception);
}

更多信息see

当这解决了中间问题时,找到与NHibernate结合的数据库服务器连接问题的根本原因是有意义的

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读