2014-05-13 71 views
3

基本上我想實現這一點:線程安全的方式來複制ConcurrentQueue

private ConcurrentQueue<FormData> _formsData; 

private void SaveForms() 
{ 
    var serializer = new DataContractSerializer(_formsData.GetType()); 
    serializer.WriteObject(fileStream, _formsData); 
} 

但我認爲它不是線程安全的傳遞ConcurrentQueueobject參數。所以我需要首先以安全的方式將整個隊列複製到另一個集合,然後將這個新集合傳遞到WriteObject

我發現CopyTo方法ConcurrentQueue,這似乎是線程安全的。但是,它需要一個預初始化數組,因此該代碼將是:

var data = new FormData[_formsData.Count]; 
_formsData.CopyTo(data, 0); 

這又似乎並不安全(元素的數量可以通過其他線程CountCopyTo通話之間變化)。

那麼有一個線程安全的方式來複制ConcurrentQueue

+0

如何在'_formsData'上獲得'lock'? –

+0

然後我需要'鎖定'_formsData'的每一個用法。這徹底打破了「ConcurrentQueue」的想法。所以我只會在沒有其他解決方案時才使用鎖。 –

+1

@Aleksey Shubin ToArray呢? http://msdn.microsoft.com/en-us/library/dd267275(v=vs.110).aspx – Brian

回答