0

由属性修饰的程序集中的类中的方法意味着在触发事件PreApplicationStartMethod之前调用。Application_Start例如,这是了解BuildManager在编译页面、控件或视图时要引用哪些程序集(除了 Web 应用程序中的程序集)的方法。
期望指出的方法只被调用一次是很自然的——毕竟它是初始化过程的一部分,通常每个应用程序只发生一次。(我只会提到两次创建数据库的尝试!!)
添加一些跟踪调用后,我发现该方法(并非总是如此,有时!)被调用了两次。为了避免这种情况,我在类中添加了一个布尔字段以防止像这样的多次调用:

   private static bool initialzed;

   public static void Initialize()

        if (PreApplicationInit.initialzed == false)
        {
            // perform the initialization here
            // ...
            PreApplicationInit.initialzed = true;
        }
    }

令我惊讶的是,该方法又被调用了两次。一个明显的怀疑是它是在两个不同的线程上调用的(尽管这在初始化代码中有点意义)。 双重检查锁定是解决此类问题的明显方法,因此我将代码更改为:

   private static readonly object SyncRoot = new Object();

   private static bool initialzed;

   public static void Initialize()
   {
        if (PreApplicationInit.initialzed == false)
        {
            lock (PreApplicationInit.SyncRoot)
            {
                if (PreApplicationInit.initialzed == false)
                {
                    // perform the initialization here
                    // ...
                    PreApplicationInit.initialzed = true;
                }
            }
        }
    }

真正使这个问题成为问题的是代码是从本机代码调用的事实。这是来自跟踪点的 $CALLER:

[Native to Managed Transition]

所以,我的问题很明显,我猜:是什么(更重要的是为什么!)调用了一个表示在Application_Start事件之前多次调用的方法?

4

0 回答 0