Tôi có một hệ thống lấy mẫu. Tôi có nhiều chủ đề khách hàng trong ứng dụng quan tâm đến các Mẫu này, nhưng quá trình thực hiện lấy mẫu chỉ có thể xảy ra trong một ngữ cảnh. Đó là đủ nhanh mà nó okay cho nó để chặn quá trình gọi điện thoại cho đến khi lấy mẫu được thực hiện, nhưng đủ chậm mà tôi không muốn nhiều chủ đề chồng chất lên yêu cầu. Tôi đã đưa ra thiết kế này (tước xuống chi tiết tối thiểu):Đây có phải là thiết kế đồng bộ hóa chính xác không?
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
}
}
Điều này có an toàn để sử dụng trong trường hợp tôi mô tả không?
+ 1 cho giải pháp đơn giản hơn. –
Các TryEnter có lẽ là tốt hơn từ một quan điểm bảo trì, như nhiều khả năng nhiều người sẽ quen thuộc với Monitor.TryEnter hơn với Interlocked.CompareExchange. Tôi không quá lo lắng về chi phí trong trường hợp này, vì tôi chỉ lấy mẫu một vài lần mỗi giây. Khi nó thực sự thực hiện lấy mẫu, chi phí của quá trình lấy mẫu chính nó sẽ khá hơn một chút so với nguyên thủy khóa, tôi chắc chắn. –
Tôi thích Monitor.TryEnter, nhưng chúng ta không nên sử dụng ReaderWriterLockSlim những ngày này ?? http://msdn.microsoft.com/en-us/library/system.threading.readerwriterlockslim_members.aspx –