在DataMember属性中使用lock属性

时间:2012-04-10 10:13:10

标签: c# wcf

我在多线程应用程序(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服务发送失败,直到我删除锁,然后它工作。 (没有当前异常,服务失败而没有登录我的跟踪)

是否有可能通过锁定来解决它,或者我必须将它转换为某些没有锁定的缩小对象?

1 个答案:

答案 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);
        }
    }