线程安全复制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

我发现ConcurrentQueueCopyTo方法,这似乎是线程安全的。但是它需要一个预先初始化的数组,所以代码是:

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

,这似乎也是不安全的(元素的数量可以被其他线程在CountCopyTo调用之间改变)。

那么有没有一种线程安全的方式来复制ConcurrentQueue呢?

线程安全复制ConcurrentQueue的方法

在ConcurrentQueue上使用ToArray方法

http://msdn.microsoft.com/en-us/library/dd267275 (v = vs.110) . aspx