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を介して送信するのは、前のオブジェクトのスケルトンバージョン(すべての内部オブジェクトから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);
        }
    }
于 2012-05-29T21:21:10.230 に答える