在我的应用程序中,我有一个启动同步过程的表单,出于多种原因,我希望一次只允许一个同步运行。所以我在我的表单中添加了一个静态bool字段,指示是否正在进行同步,并添加了一个锁定,如果尚未设置此字段,则将该字段设置为true,以便第一个线程可以启动同步,但是当它运行其他每个线程时将尝试启动它将终止。

我的代码是这样的:

internal partial class SynchronizationForm : Form
{
    private static volatile bool workInProgress;

    private void SynchronizationForm_Shown(object sender, EventArgs e)
    {
        lock (typeof(SynchronizationForm))
        {
            if (!workInProgress)
            {
                workInProgress = true;
            }
            else
            {
                this.Close();
            }
        }
    }
}

这很好用,但是当我在项目上运行Code Analysis时,我收到以下警告信息:

  

CA2002:Microsoft.Reliability:'SynchronizationForm.SynchronizationForm_Shown(object,EventArgs)'锁定类型为'Type'的引用。将其替换为具有强身份的对象的锁定。

任何人都可以向我解释我的代码有什么问题,如何改进它以使警告消失。对象具有强烈的同一性意味着什么?

有帮助吗?

解决方案

错误的是你正在锁定一些公共的东西( typeof(SynchronizationForm)),这些东西可以在你的代码中随处访问,如果某个其他线程锁定同一件事,你就会遇到死锁。一般来说,最好只锁定私有静态对象:

private static object _syncRoot = new object();
...
lock (_syncRoot) 
{

}

这可以保证只有 SynchronizationForm 才能拥有锁。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top