假设我有一个当前银行账户,并且在余额不足时自动从我的储蓄账户转账。所以,我写了下面的代码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服务中是否存在类似于“锁定”的内容?
非常感谢。
嗨,非常感谢您的帮助。我如上所述添加了服务行为定义。但它仍然没有给我我想要的结果。如果我有两个客户要求退出90,而我的余额是100,那么第一个客户返回净余额10,而下一个客户返回-80的净余额,这是负值。我该怎么办? – Michael
Hello Mihael,在这种情况下,使用ConcurrencyMode = ConcurrencyMode替换ConcurrencyMode = ConcurrencyMode.Multiple。单独致谢 –