サンプルを取るシステムがあります。これらのサンプルに関心のあるアプリケーションに複数のクライアント スレッドがありますが、サンプルを取得する実際のプロセスは 1 つのコンテキストでしか発生しません。サンプリングが完了するまで呼び出しプロセスをブロックしても問題ないほど高速ですが、複数のスレッドが要求を積み上げたくないほど遅いです。私はこのデザインを思いつきました(最小限の詳細に落とし込みました):
public class Sample
{
private static Sample _lastSample;
private static int _isSampling;
public static Sample TakeSample(AutomationManager automation)
{
//Only start sampling if not already sampling in some other context
if (Interlocked.CompareExchange(ref _isSampling, 0, 1) == 0)
{
try
{
Sample sample = new Sample();
sample.PerformSampling(automation);
_lastSample = sample;
}
finally
{
//We're done sampling
_isSampling = 0;
}
}
return _lastSample;
}
private void PerformSampling(AutomationManager automation)
{
//Lots of stuff going on that shouldn't be run in more than one context at the same time
}
}
これは、私が説明したシナリオで安全に使用できますか?