我不是 C# 中的多线程专家;我想确保防止在测试中很难触发的竞争条件,同时也几乎不可能调试。要求(我的应用程序是在可能的多线程 HTTP 服务器中使用的实用程序类,不使用 IIS 或 ASP.NET)是类的每个实例都具有该实例的唯一标识符。
我宁愿不使用重量级 GUID 来避免这个问题,因为它们的序列化长度,就像在 HTML 表示中一样。
我的问题是:在下面Unique
的类中设置值的简单模式是否Widget
适合此要求?有没有更好、更安全的模式,希望不会让实施变得繁琐?
public abstract class Widget : Node
{
private static int UniqueCount = 0;
private static object _lock = new object();
protected int Unique { private set; get; }
protected Widget() : base()
{
// There could be a subtle race condition if this is not thread-safe
// if it is used with a multi-threaded web server
lock (_lock)
{
UniqueCount += 1;
Unique = UniqueCount;
}
}
}