基本上我想实现这个目标:
private ConcurrentQueue<FormData> _formsData;
private void SaveForms()
{
var serializer = new DataContractSerializer(_formsData.GetType());
serializer.WriteObject(fileStream, _formsData);
}
但我认为将ConcurrentQueue
作为object
参数传递是不可线程安全的。所以我首先需要以安全的方式将整个队列复制到另一个集合,然后将这个新集合传递给WriteObject
。
我找到了CopyTo
的{{1}}方法,它似乎是线程安全的。但它需要一个预先初始化的数组,因此代码将是:
ConcurrentQueue
这似乎也不安全(var data = new FormData[_formsData.Count];
_formsData.CopyTo(data, 0);
和Count
之间的其他线索可以更改元素数量。)
那么有一种线程安全的方式来复制CopyTo
吗?
答案 0 :(得分:3)
在ConcurrentQueue上使用ToArray方法。
http://msdn.microsoft.com/en-us/library/dd267275(v=vs.110).aspx