我什么时候知道必须在c#基类中锁定字典?

时间:2017-08-23 01:14:00

标签: c# multithreading

我正在尝试了解C#应用程序中的多线程。我继承了一个名为SecurityComponentBase的基类中包含以下代码的应用程序:

        m_permissionsLock.EnterWriteLock();
        try
        {
            if (m_grantedPermissions.Count > 0)
            {
                m_grantedPermissions.Clear();
                m_loggingComponent.WriteSecurityLog(
                    "Security permissions cleared for user: " + CurrentLoggedUser.Username);
            }

            foreach (var p in permisions)
            {
                m_loggingComponent.WriteSecurityLog("Security permission: "+ p.PermissionName + " Granted to user: " + userName);
                m_grantedPermissions.Add(p.PermissionName, p);
            }

        }
        finally
        {
            m_permissionsLock.ExitWriteLock();
        }

m_permissionsLock定义为:

private readonly ReaderWriterLockSlim m_permissionsLock = new ReaderWriterLockSlim();

m_grantedPermissions定义为:

private readonly Dictionary<string, Permission> m_grantedPermissions = new Dictionary<string, Permission>();

开发人员什么时候才知道他将这个字典包装成锁?对我来说,我甚至不知道其他线程会来自哪里。记住我是这个多线程的新手。但我怎么知道我必须这样做?

1 个答案:

答案 0 :(得分:3)

  

开发人员什么时候才能知道他必须把这个字典包装成锁?

我们遵守以下原则:

  1. 以任何方式修改字典或其内容时,获取写入锁定。

  2. 访问字典或其内容时获取读取锁定,而不进行任何修改。

  3. 控制对字典的访问,因此在此课程中只有我们可以访问它。访问字典必须通过我们。

  4. 在您粘贴的代码中演示了#1点。第3点也在您的代码中使用private m_grantedPermissions声明进行了演示。只有此类中的代码才能访问私有成员。

      

    对我来说,我甚至不知道其他线程会来自哪里。

    调用线程来自哪里是不相关的。当一个线程执行这个类的代码时,开发人员可以发现你正在阅读和编写字典的位置,并且可以相应地包装每个引用。请记住,只有此类才能访问字典。您无需搜索整个解决方案。只是一个班级。

    在Visual Studio中,双击m_grantedPermissions应突出显示每个实例;您还可以搜索“m_grantedPermissions”以查找对它的每个引用。

    m_grantedPermissions的每个引用都应包含在正确的锁中。