私はC#のマルチスレッドの専門家ではありません。テストでトリガーするのが難しい、デバッグがほぼ不可能な競合状態を確実に防止したいと思います。要件(私のアプリケーションは、IISまたはASP.NETを使用せずに、マルチスレッドのHTTPサーバーで使用されるユーティリティクラスです)は、クラスの各インスタンスがそのインスタンスの一意の識別子を持っていることです。
HTML表現のようにシリアル化された長さがあるため、問題を回避するために重量のあるGUIDを使用したくありません。
私の質問はこれです:クラスの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;
}
}
}