2012-06-28 48 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