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

Здравствуйте, Mihael, в этом случае замените ConcurrencyMode = ConcurrencyMode.Multiple с ConcurrencyMode = ConcurrencyMode.Single –

3

На самом деле вы должны использовать ConcurrencyMode.Single, concurentcy режим одиночной будут очередями всего вызова на обслуживание BankAccountService и запрос будет выполняться один за другими. Если вы идете на ConcurrencyMode.Multiple вы сами должны реализовать блокировку потока.

+0

Большое спасибо, блокировка потоков работает ... – Michael

Смежные вопросы