C#锁定(此)方法

C#锁定(此)方法,c#,locking,initialization,C#,Locking,Initialization,理想情况下,我希望表初始化(一次),然后模拟器一次又一次地运行。因为我有3个表的初始方法也在锁中,它们一次又一次地被初始化,这不是我想要的 关于如何确保在运行演示模式下可以初始化表一次,然后反复运行模拟器的任何建议 在模拟器运行之前初始化表是至关重要的,否则它将无法工作。在这里使用锁可能不是最好的主意。您应该考虑只使用一个名为“代码>初始化的< /COD> >的变量,这是一个布尔值集,最初是 false 。如果达到此代码时将其设置为false,则运行代码初始化块并将变量设置为true。然后下次到

理想情况下,我希望表初始化(一次),然后模拟器一次又一次地运行。因为我有3个表的初始方法也在锁中,它们一次又一次地被初始化,这不是我想要的

关于如何确保在运行演示模式下可以初始化表一次,然后反复运行模拟器的任何建议


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

在这里使用锁可能不是最好的主意。您应该考虑只使用一个名为“代码>初始化的< /COD> >的变量,这是一个布尔值集,最初是<代码> false 。如果达到此代码时将其设置为
false
,则运行代码初始化块并将变量设置为
true
。然后下次到达此代码时,您的分支将计算为
false
,初始化代码将不再运行


如果您暗示这些运行不在一个应用程序调用中,而是在一系列应用程序的各个调用中分布,您可能需要在第一次将此变量写入文件,然后在以后的运行中重新读取。

其他人已经注意到了锁定模式的问题,如果不查看其余代码,很难回答此问题,但您可以轻松添加bool来帮助解决此问题

if (runInDemoMode)
{

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

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

}

锁只会防止其中的代码同时在多个线程上执行

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

bool tablesInitialized = false;

if (runInDemoMode)
{

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

            tablesInitialized = true;
        }

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

}

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

bool isInitialized = false;

...

if (runInDemoMode)
{

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

        //Simulator                   
        sim.processSimulatedData();

        isInitialized = true;
    }
    return;

}

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

您应该锁定私有对象,而不是
(常见模式是
私有只读对象_createTableLockObj=new object();
)。如果另一个类锁定了(你的类),它也会阻止你的代码进入你的锁。通过使用私有对象锁定,锁定的范围仅限于单个函数。创建一个静态易失性bool,一旦初始化,该bool设置为true。只有当这个bool为false时,才调用表初始化routine这是一个多线程应用程序吗?(您根本没有提到线程或详细说明您的设计)。lock语句允许当前线程锁定代码的关键部分(请参阅)
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();
            }
        }
    }
}