由属性修饰的程序集中的类中的方法意味着在触发事件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
事件之前多次调用的方法?