在 WinForms 中使用监视器类时出错.对象同步方法是从未同步的代码块调用的



使用 System.Threading 的 Win Form 应用程序。两个线程线程 A 和线程 B 使用相同的方法 sumNumber 启动。总和数更新变量总计。因此,这两个线程尝试更新相同的变量。

使用监视器类同步对变量的访问。

在 WindowsFormsApplication2 中出现"类型为'System.Threading.SynchronizationLockException'的未处理异常"的运行时异常.exe

其他信息:对象同步方法从未同步的代码块调用

如何正确使用监视器类。

 int total;
 private void button3_Click(object sender, EventArgs e)
        {
            listBox1.Items.Clear();
            total = 0;
            Thread threadA;
            Thread threadB;
            threadA = new Thread(sumNumber);
            threadA.Start();
            threadB = new Thread(sumNumber);
            threadB.Start();
            threadA.Join();
            threadB.Join();
            listBox1.Items.Add("Total is: " + total);
        }
        public void sumNumber()
        { 
            long numRepeats = 100000;
            for (int i = 0; i < numRepeats; i++)
            {
                Monitor.Enter(total);
                total = total + 10;
                Monitor.Exit(total);
            }
        }

传递给 Monitor.Enter 和 Monitor.Exit 的对象必须相同。由于总值发生变化,Monitor.Exit 尝试退出,但没有任何相应的 Monitor.Enter 使用相同的对象,从而引发异常

你应该有

private readonly object TotalLock = new object();

作为成员变量,则

Monitor.Enter(TotalLock);
total = total + 10;
Monitor.Exit(TotalLock);

可以缩短为

lock (TotalLock)
{
    total = total + 10;
}

最新更新