2012-02-12 88 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