-1

基本的に私はガソリンスタンドシステムをシミュレートするプログラムを作成しています。

私の問題は、次のようなWCFサービスを介してリクエストを送信しようとしていることです。

User Requests Pump to be activated ----> WCF SERVICE ---->  Point of Sale
User starts pumping petrol<---- WCF SERVICE <----  Point of Sale Accepts

現時点では機能しますが、たまにしか機能しません。

これは私が応答を得ようとする方法です:

 while(PumpserviceClient.getRequestedAcceptedStatusFromPos().Accepted == false)
 {
    PumpserviceClient.RequestPump(int.Parse(PumpID));
    // needs to wait for pump to be activated
    if (PumpserviceClient.getRequestedAcceptedStatusFromPos().Accepted == true /*&& PumpserviceClient.getRequestedAcceptedStatusFromPos().PumpNo == int.Parse(PumpID)*/)
    {
       MessageBox.Show(" The Pos has accepted your pump request");
       // if its accepted you call
       Customer.ActivatePump();
    } 

そして、これらはサービスのメソッドです:

bool Accepted= false;
bool Requested=false;
public void AcceptPump(int PumpNumber)
{
   Accepted = true;
   Requested = false;
   int pumpnumber = PumpNumber;
   PumpRequest.Accepted = Accepted;
   PumpRequest.Requested = Requested;
}

public void RequestPump(int PumpNumber)
{
   int pumpnumber = PumpNumber;
   Requested = true;
   Accepted = false;

   PumpRequest.Accepted = Accepted;
   PumpRequest.PumpNo = PumpNumber;
   PumpRequest.Requested = Requested;
}

public void ResetRequest(int PumpNumber)
{
   int pumpnumber = PumpNumber;
   Requested = false;
   Accepted = false;

   PumpRequest.Accepted = Accepted;
   PumpRequest.PumpNo = 0;
   PumpRequest.Requested = Requested;
}

public Message getRequestedStatusFromPump()
{
   return PumpRequest;
}

public Message getRequestedAcceptedStatusFromPos()
{
   return PumpRequest;
}  

}

POSシステムは、次の方法で要求を受け入れます。

if (Client.getRequestedStatusFromPump().Requested == true)
{
   MessageBox.Show("Pump Number: "+Client.getRequestedStatusFromPump().PumpNo + " Is waiting to be accepted");
   // need to press a button or something
   Client.AcceptPump(Client.getRequestedStatusFromPump().PumpNo);
}

ここにコードhttp://www.pastebucket.com/8642

4

2 に答える 2

1

投稿されたコードを読みました。次の属性を使用します。

 [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] 

これは、コードがマルチスレッドにならないことを意味します。ただし、複数のセッションが要求を行わず、互いのワークフローを「中断」しないという保証はありません。

例えば:

  1. クライアントAがリクエストポンプを呼び出します

  2. クライアントBがリセットポンプを呼び出す

  3. クライアントAが読み取ります...クライアントAは、なぜポンプがリセットされたのか疑問に思います。

あなたのコードは、オブジェクトがセッションによるものであることを期待して書かれています。このコンテキストモードを使用して、運が良かったかどうかを確認することをお勧めします。

もう1つのオプションは、モデルにセッション情報を追加することです。なぜこれが役立つのか想像できません。それは確かに簡単ではありません。

于 2013-03-26T17:15:15.050 に答える
0

サービスの動作を変更せずにこの問題を回避する唯一の方法は、新しいリストを作成することでした。

 public void CreatePumpList()
    {
        WaitingPumps = new List<WaitingPumps>();
        for (int i = 0; i < PumpLimit+1 ; i++)
        {
            WaitingPumps.Add(new WaitingPumps());
        }
    }

次に、ポンプ番号をこのリストのインデックスとして使用して、互いに混同しないようにします。

于 2013-03-28T12:43:55.693 に答える