【发布时间】:2015-12-18 17:09:39
【问题描述】:
我的代码的 Lock() 关键部分有问题。情况是我的输出包含重复项,我不能这样!您可以在下面看到复制我的情况的代码。我的情况真的很愚蠢,如果我错过了一些非常愚蠢的东西,请原谅......
private static object theLock = new object();
private static int currentNumber = 0;
。 . .
static void Main(string[] args)
{
for (int i = 0; i < 30; i++)
CreateAndRunWorker();
}
。 . .
private static void CreateAndRunWorker()
{
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += new DoWorkEventHandler(TheWorkToBeDone);
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(TheWorkAfterWork);
worker.RunWorkerAsync();
}
。 . .
private static void TheWorkToBeDone(object sender, DoWorkEventArgs e)
{
OutputNum();
}
。 . .
private static void TheWorkAfterWork(object sender, RunWorkerCompletedEventArgs e)
{
CreateAndRunWorker();
}
。 . .
private static void OutputNum()
{
lock (theLock)
{
currentNumber++;
Console.WriteLine(currentNumber);
}
}
上面的内容被 25 个后台工作人员从 Main() 函数调用。锁和计数器是全局初始化的。输出包含重复的数字。如何?
【问题讨论】:
-
向我们展示更多代码。是在winforms吗?您如何以及在何处致电
OutputNum? -
我会说您可能正在某处重新设置“theLock”。无论如何,您向我们展示的代码不包含问题。
-
我将添加更多代码,一秒钟。它是一个控制台应用程序。
-
@bokibeg 好吧,代码最终会溢出
int并再次开始重复值。由于提供的信息不完整,尚不清楚他是否观察到了这一点。 -
这个问题的主要内容是给出的代码工作正常。
标签: c# .net multithreading locking