C#lock(this)方法

时间:2013-07-24 13:35:05

标签: c# locking initialization

if (runInDemoMode)
{

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

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

}

理想情况下,我希望初始化表(一次),然后一次又一次地运行模拟器。因为我有3种初始方法也可以锁定它们,所以它们会一次又一次地进行初始化,这不是我想要的。

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

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

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分: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类可能更好。

答案 2 :(得分: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;

}

答案 3 :(得分:0)

lock只会保持其中的代码不会同时在多个线程上执行。

你需要的是你班级中的初始化变量,或者在适当的任何级别(目前还不清楚你需要它的地方),让你的代码知道它已经初始化了。

bool isInitialized = false;

...

if (runInDemoMode)
{

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

        //Simulator                   
        sim.processSimulatedData();

        isInitialized = true;
    }
    return;

}