zoukankan      html  css  js  c++  java
  • Transaction Manager Maximum Timeout

    TransactionManager.MaximumTimeout是个只读的属性, 默认只有10分钟, 要想修改它必须通过machine.config来修改. 为了单个应用而去修改这个值是不合适的. stackoverflow.com上是给出的解释都是修改machine.config来完成的.

    下面我给出一种单个应用独立解决的办法, 方法很简单就是修改这个只读属性.

    先通用你自己的工具查看一下代码实现, 我这里是用Reshaper通过从微软那里下载下来的.

    /// <summary>
    /// Gets the default maximum timeout interval for new transactions.
    /// </summary>
    /// 
    /// <returns>
    /// A <see cref="T:System.TimeSpan"/> value that specifies the maximum timeout interval that is allowed when creating new transactions.
    /// </returns>
    public static TimeSpan MaximumTimeout
    {
      get
      {
        if (!TransactionManager._platformValidated)
          TransactionManager.ValidatePlatform();
        if (DiagnosticTrace.Verbose)
          MethodEnteredTraceRecord.Trace(SR.GetString("TraceSourceBase"), "TransactionManager.get_DefaultMaximumTimeout");
        if (!TransactionManager._cachedMaxTimeout)
        {
          lock (TransactionManager.ClassSyncObject)
          {
            if (!TransactionManager._cachedMaxTimeout)
            {
              TransactionManager._maximumTimeout = TransactionManager.MachineSettings.MaxTimeout;
              TransactionManager._cachedMaxTimeout = true;
            }
          }
        }
        if (DiagnosticTrace.Verbose)
          MethodExitedTraceRecord.Trace(SR.GetString("TraceSourceBase"), "TransactionManager.get_DefaultMaximumTimeout");
        return TransactionManager._maximumTimeout;
      }
    }
    

    看上去只要读取一些Config文件然后修改_maximumTimeout这个就可以了.实现代码如下:

        private static void ChangeTransactionManagerMaximumTimeout()
        {
            var customMaximumTimeout = TimeSpan.MaxValue;
            var maximumTimeout = TransactionManager.MaximumTimeout;
    
            FieldInfo fieldInfo = typeof(TransactionManager).GetFields(BindingFlags.NonPublic | BindingFlags.Static).Single(item => item.Name == "_maximumTimeout");
            fieldInfo.SetValue(null, customMaximumTimeout);
            maximumTimeout = TransactionManager.MaximumTimeout;
        }
    

    这样在以后程序内部再次调用TransactionManager.MaximumTimeout就是修改过的timeout了.

  • 相关阅读:
    【杂谈】SpringBoot为啥不用配置启动类
    【API知识】SpringBoot项目中@EnableXXX的原理
    【杂谈】再看生产-消费模式
    【杂谈】Hash表与平衡树
    【杂谈】如何对Redis进行原子操作
    【杂谈】从底层看锁的实现2
    【杂谈】从底层看锁的实现
    HashMap的简易解读
    定时任务、反射、注解
    值得收藏的js原型详解
  • 原文地址:https://www.cnblogs.com/cuiweifu/p/3786465.html
Copyright © 2011-2022 走看看