在我的应用程序中,我有一个启动同步过程的表单,出于多种原因,我希望一次只允许运行一个同步。因此,我在我的表单中添加了一个静态 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();
}
}
}
}
这运行良好,但是当我对我的项目运行代码分析时,我收到以下警告消息:
CA2002 : Microsoft.Reliability : 'SynchronizationForm.SynchronizationForm_Shown(object, EventArgs)' locks on a reference of type 'Type'. Replace this with a lock against an object with strong-identity.
任何人都可以向我解释我的代码有什么问题以及我如何改进它以使警告消失。对象具有强身份是什么意思?
最佳答案
错误的是您锁定了公共(public)的东西 (typeof(SynchronizationForm)
),它可以从您的代码中随处访问,如果其他线程锁定了同样的东西,您就会陷入僵局。一般来说,只锁定私有(private)静态对象是个好主意:
private static object _syncRoot = new object();
...
lock (_syncRoot)
{
}
这向您保证只有 SynchronizationForm
可以拥有锁。
关于C#锁和代码分析警告CA2002,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1613588/