c# – 在静态类中使字典安全吗?

到目前为止,我一直在C#库中开发静态类,所有方法显然都是静态的.传入任何被操纵的数据,因此这是线程安全的.但是,我正在实现一个功能,需要一个Dictionary来计算某些字符串ID,这些ID将针对每个线程生成不同的内容.显然使用类似下面的东西将不是线程安全的,因为多个线程将使用相同的字典并弄乱其状态:

private static readonly Dictionary<string, uint> MyTallies = new Dictionary<string, uint>();

那么什么是使这个线程安全的最佳选择?我看到它的方式,有3个(有点坏)选项:

>使类非静态;每个线程都必须创建一个新实例,并且可以为每个线程创建一个新的Dictionary.表现受到欢迎
>使用Dictionary锁定代码,并在锁定结束时清除Dictionary.性能大打出手.
>将字典传递给需要它的每个方法.然而,这会导致一个Dictionary被传入,只是为了一个大部分时间都不会被使用的可选功能,所以对于调用代码来说这似乎是一件奇怪的事情.由于调用代码每次都必须创建Dictionary实例,因此性能也会受到影响.

那么这里我最好的选择是什么,还是有其他更好的选择我还没有想过?

编辑:一个简单的用例:

internal static class HtmlFormatter {
    private static readonly Dictionary<string, uint> MyTallies = new Dictionary<string, uint>();

    internal static string RenderHtml(string markdown) {
        string outputHtml = "";

        // (process markdown and render to HTML)
        // (found a heading that requires a unique ID)
        var id = generatedId;
        string unique = "";
        if (MyTallies.ContainsKey(id)) {
            // Already exists; suffix "-x" where x is count of duplicate IDs
            unique = "-" + ++MyTallies[id];
        }
        else {
            MyTallies[id] = 0;
        }
        id += unique;

        // (append id string to HTML output and continue processing)

        return outputHtml;
    }
}

最佳答案 有关某些线程安全集合的概述,请参见
this

点赞