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