1

我在多线程应用程序(托管在 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 服务发送失败,然后它就可以工作了。(没有当前异常,服务失败而未登录我的跟踪)

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

4

1 回答 1

0

所以当我没有得到答案时,我写了我自己的解决方案。

正如我在评论中所写,Value 属性的类型是List<string>(后来更改为List<SomeMyObject>),当我删除锁时,由于集合被修改,我得到了异常。然后我创建一个方法,该方法对我的列表进行 DeepCopy,我通过 WCF 发送的是前一个对象的骨架版本(从所有内部对象中,我只采用 Ids):

    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);
        }
    }
于 2012-05-29T21:21:10.230 回答