1

現在の銀行口座を持っていて、残高が少なくなると普通預金口座から自動的に送金されるとします。だから、私は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 サービスの「ロック」に似たものはありますか?

どうもありがとうございました。

4

2 に答える 2

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
于 2012-06-28T19:33:38.197 に答える
3

実際には ConcurrencyMode.Single を使用している必要があります。同時実行モード single はサービス BankAccountService へのすべての呼び出しをキューに入れ、リクエストは次々に実行されます。ConcurrencyMode.Multiple を使用する場合は、自分でスレッド ロックを実装する必要があります。

于 2012-06-29T04:36:04.637 に答える