2012-06-28 47 views
1

假设我有一个当前银行账户,并且在余额不足时自动从我的储蓄账户转账。所以,我写了下面的代码WCF:WCF数据同步

//Servicer side: 

[ServiceContract] 
public interface IBankAccount 
{ 
    [OperationContract] 
    double withdraw(double amount); 

    [OperationContract] 
    double enquiry(); 
} 

class BankAccountService:IBankAccount 
{ 
    public double enquiry() 
    { 
     return balance; 
    } 
    public double withdraw(double amount) 
    { 
     while (balance < amount) 
     { 
      transferMoreMoney(); 
     } 

     deduct(amount); 

     return balance; 
    } 

    public void deduct(double amount) 
    { 
     System.Threading.Thread.Sleep(10000); 
     balance -= amount; 
    } 

    public void transferMoreMoney() 
    { 
     System.Threading.Thread.Sleep(10000); 
     balance += maximizeTransferAmount; 
    } 

    private static double balance; 
    private double maximizeTransferAmount = 100.0; 
} 


//Client side: 
    ServiceReference1.BankAccountClient client = new ServiceReference1.BankAccountClient(); 
     while (true) 
     { 
      try 
      { 

       string tmpStr = Console.ReadLine(); 
       if (tmpStr == "") 
        break; 

       double v0 = client.enquiry(); 
       Console.WriteLine("Current balance is:{0}", v0); 

       double v1 = Convert.ToDouble(tmpStr); 
       Console.WriteLine("Amount withdrawn is:{0}", v1); 

       double v2 = client.withdraw(v1); 
       Console.WriteLine("Remaining balance is:{0}", v2); 
      } 
      catch (CommunicationException e) 
      { 
       Console.WriteLine(e.Message); 
      } 
     } 

的问题是,当我有多个客户端调用相同的服务,余额可以为负值。我怎样才能确保余额能够按时补充而不会消失?

此外,我还有其他客户端只运行余额查询,所以如果他们只查询,他们不应该等待,谁来确保这一点?

这只是一个例子,说明我需要什么。这个例子说明了我需要解决的技术问题,但不是真实的情况。我不能使用数据库,因为我的真实情况是需要在内存中进行高性能实时计算的情况,所以数据库不是一种选择。

更基本的是,当多个客户端调用共享相同数据的相同服务时,WCF服务中是否存在类似于“锁定”的内容?

非常感谢。

回答

3
you must define behavior specific for your service wcf (Singleton Instance Mode + Concurrency Mode Multiple) 

    [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, 
     ConcurrencyMode = ConcurrencyMode.Multiple)] 
    public class BankAccountService: IBankAccount 
    { 

    } 

Note : You can also define your behavior in config file 
+0

嗨,非常感谢您的帮助。我如上所述添加了服务行为定义。但它仍然没有给我我想要的结果。如果我有两个客户要求退出90,而我的余额是100,那么第一个客户返回净余额10,而下一个客户返回-80的净余额,这是负值。我该怎么办? – Michael

+0

Hello Mihael,在这种情况下,使用ConcurrencyMode = ConcurrencyMode替换ConcurrencyMode = ConcurrencyMode.Multiple。单独致谢 –

3

事实上,你必须使用ConcurrencyMode.Single,concurentcy模式单将队列中的所有呼叫服务BankAccountService和请求将被执行的另一个之后。如果你使用ConcurrencyMode.Multiple,你必须实现线程锁定。

+0

非常感谢,线程锁定可以工作... – Michael