我是WCF和线程的新手,所以请耐心等待。我有一个WCF服务设置。该服务具有多个线程,所有线程都作用于单个阵列。到目前为止,这没有问题。但是,此服务有一个方法,在调用时将返回该数组。我的问题:
当数组通过WCF传输到客户端时序列化。这是一个线程安全的操作吗?换句话说,我可以依靠WCF阻止所有线程在序列化时访问该阵列吗?
如果我不能指望WCF这样做,那么我该如何手动实现呢?我真的不明白WCF如何促进这一点,因为序列化发生在我从方法调用返回后。我怎样才能保证线程在我的方法返回后但在WCF序列化之前不会修改数组?
答案 0 :(得分:3)
不,WCF运行时不会为您锁定数据。即使它会,它也不能阻止你在另一个线程中访问数组。
我认为获得此线程安全的唯一可能性是在离开函数之前复制您在私有变量中返回的数据:
string[] Servicemethod()
{
lock(myLock)
{
byte[] localCopy = new byte[myData.Length];
Array.Copy(myData, localCopy, myData.Length);
return localCopy;
}
}
修改强>
如果它不是复制大型数据结构的选项,则另一个选项可能是不返回数组,而是返回实现ISerializable
的自定义类的实例。
这样你就可以自己编写一个线程安全的序列化数据。
但在此之前,我会衡量额外副本的影响。