基本上我想實現這一點:線程安全的方式來複制ConcurrentQueue
private ConcurrentQueue<FormData> _formsData;
private void SaveForms()
{
var serializer = new DataContractSerializer(_formsData.GetType());
serializer.WriteObject(fileStream, _formsData);
}
但我認爲它不是線程安全的傳遞ConcurrentQueue
爲object
參數。所以我需要首先以安全的方式將整個隊列複製到另一個集合,然後將這個新集合傳遞到WriteObject
。
我發現CopyTo
方法ConcurrentQueue
,這似乎是線程安全的。但是,它需要一個預初始化數組,因此該代碼將是:
var data = new FormData[_formsData.Count];
_formsData.CopyTo(data, 0);
這又似乎並不安全(元素的數量可以通過其他線程Count
和CopyTo
通話之間變化)。
那麼有一個線程安全的方式來複制ConcurrentQueue
?
如何在'_formsData'上獲得'lock'? –
然後我需要'鎖定'_formsData'的每一個用法。這徹底打破了「ConcurrentQueue」的想法。所以我只會在沒有其他解決方案時才使用鎖。 –
@Aleksey Shubin ToArray呢? http://msdn.microsoft.com/en-us/library/dd267275(v=vs.110).aspx – Brian