2012-02-12 86 views
1

我正在研究一個項目,我必須將數據存儲在WCF服務中,但我不確定如何在數據被操縱時維護更改。WCF服務存儲和操作集合?

[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]; 
    } 
} 

當客戶使用這項服務,我怎麼可以把收集cl的更新值那麼現在?

回答

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

我嘗試使用私有靜態SynchronizedCollection cl;但是當我運行減少後返回值(0)時,我仍然得到5而不是4. – 2012-02-12 22:39:54

+0

@JohnDoe,在兩次調用之間重啓服務的任何機會?因爲你每次重新編譯並運行WCF服務時都會將列表存儲在內存中,因此它將重新初始化它的值。如果你想以持久的方式保存這個列表,你可能會考慮將它存儲在一個文件或數據庫中,而不是將它保存在服務器的內存中。 – 2012-02-12 22:44:59

+0

服務正在運行,我運行vs2010的兩個實例,其中服務一個與客戶端。 – 2012-02-12 22:53:48