-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;
}  

}

并且销售点系统通过以下方式接受请求:

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 想知道为什么泵被重置。

您编写的代码期望对象是会话。我建议使用这种上下文模式,看看你是否有更好的运气。

另一种选择是将会话信息添加到您的模型中。我无法想象为什么这会有用。这肯定不容易。

于 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 回答