线程安全复制ConcurrentQueue的方法
本文关键字:方法 ConcurrentQueue 复制 安全 线程 | 更新日期: 2023-09-27 18:02:57
基本上我想做到这一点:
private ConcurrentQueue<FormData> _formsData;
private void SaveForms()
{
var serializer = new DataContractSerializer(_formsData.GetType());
serializer.WriteObject(fileStream, _formsData);
}
但我认为传递ConcurrentQueue
作为object
参数不是线程安全的。因此,我需要首先将整个队列以安全的方式复制到另一个集合,然后将这个新集合传递给WriteObject
。
我发现ConcurrentQueue
的CopyTo
方法,这似乎是线程安全的。但是它需要一个预先初始化的数组,所以代码是:
var data = new FormData[_formsData.Count];
_formsData.CopyTo(data, 0);
,这似乎也是不安全的(元素的数量可以被其他线程在Count
和CopyTo
调用之间改变)。
那么有没有一种线程安全的方式来复制ConcurrentQueue
呢?
在ConcurrentQueue上使用ToArray方法
http://msdn.microsoft.com/en-us/library/dd267275 (v = vs.110) . aspx