C#锁和代码分析警告CA2002

标签 c# locking code-analysis

在我的应用程序中,我有一个启动同步过程的表单,出于多种原因,我希望一次只允许运行一个同步。因此,我在我的表单中添加了一个静态 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/

相关文章:

C#:SkipLast 实现

java - 如果锁本身被争用会怎样?

c++ - 在命令行或从 CMake 指定用于 Visual Studio 代码分析的规则集

c# - PdfStamper正在处理输出流吗? (iTextSharp)

r - 识别 R 函数和脚本的依赖关系

c# - C#.Net 中的图像压缩

c# - 无法在 Windows 7 上读取 64 位注册表项

c# - 将逻辑放入 ViewModel get'ers

multithreading - 这是双重检查锁定的安全版本吗?

java - Java 中的 Linux 文件锁定