到目前为止,我一直在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