2013-03-26 2 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

+0

У вас возникли ошибки? Каковы обстоятельства, когда это не работает? Что происходит, когда это не работает? Вы шлепали плохое обслуживание? – MyCodeSucks

+0

Извините, если он не работает «MessageBox.Show (« Поз принял ваш запрос на насос »); // если его принято вызывать Customer.ActivatePump(); « Не звонит –

ответ

1

Я прочитал код, отправленный. Вы используете следующий атрибут:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] 

Это означает, что ваш код не будет многопоточным. Но нет гарантии, что несколько сеансов не будут обрабатывать запросы и «прерывать» друг друга.

Например: вызовы

  1. Client A ЗАЯВКА насос

  2. Client B вызывает сброс насоса

  3. Клиент А читает ... клиент А задается вопросом, почему насос был сброшен.

Ваш код написан, ожидая, что объект будет проходить по сеансу. Я бы предложил использовать этот контекстный режим и посмотреть, есть ли у вас больше удачи.

Другой вариант - добавить информацию о сеансе к вашей модели. Я не могу представить, почему это было бы полезно. Конечно, это будет нелегко.

+0

Я попытался изменить контекстный режим, и ничего не случилось, я думаю, что мне просто придется подумать о другом способе принять каждый насос. Но спасибо за вашу помощь в любом случае –

+0

hmmm ... вы могли бы попытаться удалить этот вопрос и снова запросить полный доступный источник. – Hogan

+0

Я мог бы сделать, В тот момент, когда мой клиент PoS может просматривать все насосы, когда они отправляют информацию, и потому что все, что они делают, отправляется в список, а PoS считывает список и фильтрует его с помощью Pump ID, он отлично работает. Мне почти нужно, чтобы каждый насос имел свой раздел или список для получения и установки PoS, тогда не было бы никаких перерывов. Я просто не знаю, как это сделать –

0

Единственный способ я нашел эту проблему, не изменяя поведение службы было создать новый список

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

Тогда просто используйте номер насоса в качестве индекса в этом списке, чтобы они не запутались с друг друга.

Смежные вопросы