我在多线程应用程序(Windows托管服务中托管的WCF服务)中使用这样的属性:
private object lockObj = new object();
private string val = string.Empty;
[DataMember]
public string Value
{
get
{
lock(lockObj)
{
return val;
}
}
set
{
lock(lockObj)
{
val = value;
}
}
}
通过WCF服务发送失败,直到我删除锁,然后它工作。 (没有当前异常,服务失败而没有登录我的跟踪)
是否有可能通过锁定来解决它,或者我必须将它转换为某些没有锁定的缩小对象?
答案 0 :(得分:0)
因此我没有得到答案,我自己编写解决方案。
当我在注释中写入时,Value属性的类型为List<string>
(后来更改为List<SomeMyObject>
),当我删除锁时,由于集合被修改,我得到了异常。然后我创建了一个方法,它使我的列表的DeepCopy和我通过WCF发送的是前一个对象的Skelet版本(来自I ID的所有内部对象):
public Skelet ToSkelet()
{
var result = new Skelet
{
Waiting = Waiting.DeepClone().ConvertAll(x => x.Id),
Open = Open.DeepClone().ConvertAll(x => x.Id),
Finished = Finished //this one is int
};
return result;
}
在SO上发现了DeepClone方法:
public static T DeepClone<T>(this T obj)
{
using (var ms = new MemoryStream())
{
var formatter = new BinaryFormatter();
formatter.Serialize(ms, obj);
ms.Position = 0;
return (T)formatter.Deserialize(ms);
}
}