2013-03-26 23 views
-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

+0

它只有时有效。好的,否则会发生什么? – tnw 2013-03-26 15:10:31

+0

你有错误吗?什么情况下不起作用?当它不起作用时会发生什么?你打击了这种行为不端的服务吗? – MyCodeSucks 2013-03-26 15:12:33

+0

对不起,当它不起作用“MessageBox.Show(”Pos已接受您的泵请求“); //如果它接受您致电 Customer.ActivatePump(); ”不调用 – 2013-03-26 15:13:09

回答

1

我读了发布的代码。您使用以下属性:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] 

这意味着您的代码将不会多线程。但是不能保证多个会话不会提出请求并“中断”彼此的工作流程。

例如:

  1. 客户A的呼叫请求泵

  2. 客户端B调用复位泵

  3. 客户A读取...客户端A想知道为什么泵被重置。

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

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

+0

我试着改变上下文模式,但似乎没有任何事情发生,我想我只需要想一个不同的方式来接受每个泵。但是,无论如何感谢您的帮助 – 2013-03-27 11:55:24

+0

嗯......你可以尝试删除这个问题,并再次询问可用的完整源代码。 – Hogan 2013-03-27 12:07:20

+0

我可能会这样做,当我的PoS客户端在发送信息时可以查看所有泵,因为他们所做的全部都是发送到列表,PoS通过泵ID读取列表和过滤器,所以它工作正常。 我几乎需要让每个泵都有自己的部分或列表供PoS获取和设置,那么就不会有中断。我只是不确定该怎么做 – 2013-03-27 12:29:01

0

我发现解决此问题,在不改变服务行为的唯一方法是创建一个新的列表

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

然后,只需使用此列表中的泵号作为索引,以便他们没有得到混淆彼此。