Metoda asynchroniczna dla QueueClient.Receive ()?
Używam magistrali usług do łączenia roli sieci Web i roli pracownika. Moja rola pracownika jest w ciągłej pętli i otrzymuję wiadomość wysłaną przez rolę WWW za pomocą metody QueueClient.Receive ().
Jednak w przypadku tej metody, jeśli w kolejce magistrali usług nie ma komunikatu, czeka on kilka sekund na odebranie wiadomości, zamiast przejść do następnej linii w celu dalszego wykonania. Miałem nadzieję, że będzie jakiś asynchroniczny sposób odbierania wiadomości? lub przynajmniej jakiś sposób na ustawienie tego czasu oczekiwania?
Znalazłem tę metodę BeginReceive z dokumentacji msdnKlient kolejki i miałem nadzieję, że to będzie odpowiedź na moje pytanie, ale nie wiem, jak użyć tej metody. Parametrami metody są asynchroniczne wywołania zwrotne i stan obiektu, których nie wiem, czym one są.
Jakieś pomysły?
AKTUALIZACJA: Dzięki świetnemu rozwiązaniu Sandrino działa niezawodnie. Ale bycie asynchronicznym sprawia mi teraz pewne problemy. Mój VS ulega awarii. Nie jestem pewien w czym tkwi problem. Poniżej znajduje się kod, którego używam.
Rola pracownika:
public override void Run()
{
while (!IsStopped)
{
// Receive the message from Web Role to upload the broadcast to queue
BroadcastClient.BeginReceive(OnWebRoleMessageReceived, null);
// Receive the message from SignalR BroadcastHub
SignalRClient.BeginReceive(OnSignalRMessageReceived, null);
}
}
public void OnWebRoleMessageReceived(IAsyncResult iar)
{
BrokeredMessage receivedBroadcastMessage = null;
receivedBroadcastMessage = BroadcastClient.EndReceive(iar);
if (receivedBroadcastMessage != null)
{ //process message
receivedBroadcastMessage.Complete();
}
}
public void OnSignalRMessageReceived(IAsyncResult iar)
{
BrokeredMessage receivedSignalRMessage = null;
receivedSignalRMessage = SignalRClient.EndReceive(iar);
if (receivedSignalRMessage != null)
{
//process message
receivedSignalRMessage.Complete();
WorkerRoleClient.Send(signalRMessage);
}
}
Czy brakuje mi niczego, co sprawia, że VS działa ponad i działa? Ponieważ przed przejściem do BeginReceive, gdy iw jak przy użyciu QueueClient.Receive, działało poprawnie i nie ulegało awarii.
Dzięki