У меня есть система, которая берет образцы. У меня есть несколько клиентских потоков в приложении, которые заинтересованы в этих образцах, но фактический процесс взятия образца может происходить только в одном контексте. Это достаточно быстро, чтобы блокировать вызывающий процесс до тех пор, пока не будет выполнена выборка, но достаточно медленно, чтобы я не хотел, чтобы несколько потоков накапливали запросы. Я придумал этот дизайн (урезанный до минимума деталей):
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
}
}
Это безопасно для использования в сценарии, который я описал?