2
if (runInDemoMode)
{

    lock (this)
    {
        //Initalization of tables
        dCreator.createInitialTables();
        SetupPlugins();
        AutoConfigure(database);

        //Simulator                   
        sim.processSimulatedData();
    }
    return;

}

理想情况下,我希望初始化表(一次),然后模拟器一次又一次地运行。由于我有 3 个用于表的初始方法也处于锁定状态,因此它们会一次又一次地初始化,这不是我想要的。

关于如何确保如果我处于运行演示模式的任何建议,我可以初始化表一次,然后一次又一次地运行模拟器。

在模拟器运行之前初始化表格至关重要,否则它将无法工作。

4

4 回答 4

2

在这里使用锁可能不是最好的主意。您应该考虑只使用一个名为的变量,该变量initialized最初设置为false. 如果false在到达此代码时设置为,则运行代码的初始化块并将变量设置为true。然后下次到达此代码时,您的分支将评估为false并且初始化代码将不会再次运行。

如果您暗示这些运行不在一个应用程序调用中,而是分布在您的应用程序的各个调用中,您可能必须第一次将此变量写入文件,然后在以后的运行中将其读回。

于 2013-07-24T13:38:59.560 回答
1

您可能正在寻找双重检查锁定。

private static readonly object _locker = new object();

public SomeClass(bool runInDemoMode)
{
    if (runInDemoMode)
    {
        lock (_locker)
        {
            if (runInDemoMode)
            {
                //Initalization of tables
                dCreator.createInitialTables();
                SetupPlugins();
                AutoConfigure(database);

                //Simulator                   
                sim.processSimulatedData();
            }
        }
    }
}

最好将此逻辑抽象到某个DemoInitializer可以独立设置和拆卸应用程序的类中。

于 2013-07-24T13:43:04.137 回答
0

其他人已经注意到您的锁定模式存在问题,如果没有看到您的其余代码,这很难回答,但您可以轻松添加一个 bool 来帮助解决这个问题。

bool tablesInitialized = false;

if (runInDemoMode)
{

    lock (this)
    {
        if (!tablesInitialized)
        {
            //Initalization of tables
            dCreator.createInitialTables();
            SetupPlugins();
            AutoConfigure(database);

            tablesInitialized = true;
        }

        //Simulator                   
        sim.processSimulatedData();
    }
    return;

}
于 2013-07-24T13:40:06.313 回答
0

lock 只会阻止其中的代码同时在多个线程上执行。

您需要的是类中的初始化变量或任何适当级别的初始化变量(目前尚不清楚您需要它的位置),让您的代码知道它已经初始化。

bool isInitialized = false;

...

if (runInDemoMode)
{

    if (!isInitialized)
    {
        //Initalization of tables
        dCreator.createInitialTables();
        SetupPlugins();
        AutoConfigure(database);

        //Simulator                   
        sim.processSimulatedData();

        isInitialized = true;
    }
    return;

}
于 2013-07-24T13:40:20.830 回答