我使用ReaderWriterLock類來鎖定一個Quotes集合,它是一個SortedDictionary。我正在考慮使用while循環,直到線程可以獲取讀寫器鎖定,以防寫入時暫時鎖定。第一個問題,我的測試工作正常,但這種方法有什麼缺點。第二個問題,這樣做的最佳/最佳實踐方式是什麼?是否可以(避免死鎖,陷阱等...)嘗試獲取睡眠循環中的鎖?
public void RequestQuote(string symbol, QuoteRequestCallback qrc)
{
// add the call back on a list and take care of it when the quote is available
while (!AcquireReaderLock(100)) Thread.Sleep(150);
if (Quotes.ContainsKey(symbol))
{
qrc(Quotes[symbol]);
rwl.ReleaseReaderLock();
}
else
{
rwl.ReleaseReaderLock();
lock (requestCallbacks)
requestCallbacks.Add(new KeyValuePair<string, QuoteRequestCallback>(symbol, qrc));
// request symbol to be added
AddSymbol(symbol);
}
}
private bool AquireReaderLock(int ms)
{
try
{
rwl.AcquireReaderLock(ms);
return true;
}
catch (TimeoutException)
{
return false;
}
}
private bool AquireWriterLock(int ms)
{
try
{
rwl.AcquireWriterLock(ms);
return true;
}
catch (TimeoutException)
{
return false;
}
}
如果AcquireReaderLock永不返回true,會發生什麼情況?你的程序是否保持一致的狀態? – 2011-06-15 00:02:15
如果AcquireReaderLock永遠不會返回true,則RequestQuote會掛起無限循環。我將在編輯中粘貼代碼。 – bkarj 2011-06-15 00:09:06
嗯,我的觀點是你不能認爲它會。所以,如果超過了一定的重試次數,你需要一些機制來打破你的等待循環。 – 2011-06-15 00:10:35