2012-02-12 13 views
1

私はWCFサービスにデータを格納する必要があるプロジェクトに取り組んでいますが、データが操作されたときにどのように変更を維持できるかはわかりません。だから今、クライアントは、私がコレクションclの更新値を送信することができますどのようにこのサービスを利用する際WCF Service StoreおよびManipulate Collection?

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single, InstanceContextMode = 
InstanceContextMode.Single,UseSynchronizationContext = true)] 
public class TestService : ITestService { 
    private List<TestClass> cl; 

    public TestService() 
    { 
     cl = new List<TestClass>(); 
     TestClass tc = new TestClass(5); 
     cl.add(tc); 
    } 

    public void Diminish(int x) 
    { 
     cl[0].Value -= x; 
    } 

    public TestClass ReturnValue(int p) 
    { 
     return cl[p]; 
    } 
} 

答えて

1

静的フィールドを使用できます。しかし、あなたはList<T>クラスはスレッドセーフではありませんので、あなたはそれへのアクセスを同期する必要があることを行う明らかに一度:

public class TestService : ITestService { 
    private static List<TestClass> cl; 
    private static object _syncRoot = new object(); 

    static TestService() 
    { 
     cl = new List<TestClass>(); 
     TestClass tc = new TestClass(5); 
     cl.Add(tc); 
    } 

    public void Diminish(int x) 
    { 
     lock (_syncRoot) 
     { 
      cl[0].Value -= x; 
     } 
    } 

    public TestClass ReturnValue(int p) 
    { 
     lock (_syncRoot) 
     { 
      return cl[p]; 
     } 
    } 
} 

か、また、スレッドセーフであるSynchronizedCollection<T>クラスを使用することができます。

public class TestService 
{ 
    private static SynchronizedCollection<TestClass> cl; 

    static TestService() 
    { 
     cl = new SynchronizedCollection<TestClass>(); 
     TestClass tc = new TestClass(5); 
     cl.Add(tc); 
    } 

    public void Diminish(int x) 
    { 
     cl[0].Value -= x; 
    } 

    public TestClass ReturnValue(int p) 
    { 
     return cl[p]; 
    } 
} 
+0

Iをプライベート静的SynchronizedCollectionを使用しようとしました cl;しかし、私が戻り値(0)を実行した後、私はまだ5を得て4ではありません。 –

+0

@JohnDoe、あなたは2つの呼び出しの間にサービスを再起動しましたか?なぜなら、WCFサービスを再コンパイルして実行するたびに、リストをメモリに格納しているので、その値が再初期化されるからです。永続的な方法でこのリストを永続化したい場合は、サーバーのメモリ内に残す代わりに、ファイルまたはデータベースに格納することを検討することもできます。 –

+0

サービスが稼働していますが、私は2つのインスタンスvs2010を実行しています。 –

関連する問題