J'utilise le bus de service pour connecter le rôle Web et le rôle de travailleur. Mon rôle de travail est dans une boucle continue et je reçois le message envoyé par le rôle web avec la méthode QueueClient.Receive(). Mais avec cette méthode, s'il n'y a pas de message sur la file d'attente du bus de service, il attend quelques secondes pour recevoir le message plutôt que de passer à la ligne suivante pour une exécution ultérieure. J'espérais qu'il y aurait une méthode asynchrone pour recevoir des messages? ou au moins un moyen de régler ce temps d'attente?Méthode asynchrone pour QueueClient.Receive()?
J'ai trouvé cette méthode BeginReceive de la documentation msdn de QueueClient et j'espérais que ce serait la réponse à ma question mais je ne sais pas comment utiliser cette méthode. Les paramètres de la méthode sont le rappel asynchrone et l'état de l'objet dont je ne sais pas ce qu'ils sont.
Des idées?
MISE À JOUR: Merci à une excellente solution par Sandrino, cela fonctionne asynchrnously. Mais être asynchrone me pose maintenant quelques problèmes. Mon VS plante. Je ne sais pas quel est le problème. Ci-dessous le code que j'utilise.
Travailleur Rôle:
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);
}
}
Suis-je manquer sur tout ce qui fait la VS sur le travail et tomber en panne? Parce qu'avant de passer à BeginReceive, quand iw utilisait QueueClient.Receive, cela fonctionnait bien et ne se bloquait pas.
Merci
Merci !! Cela fonctionne, c'est asynchrone, mais je ne sais pas pourquoi, mon VS s'est accroché et s'est écrasé trois fois quand j'ai envoyé des messages au bus de service. J'ai mis à jour la question et ajouté du code s'il vous plaît regardez-le et laissez-moi savoir si vous savez quel est le problème. Merci encore – Bitsian
La méthode BeginReceive revient immédiatement, ce qui signifie que votre boucle while est en boucle encore et encore (boucle infinie). Une boucle while comme celle-ci fonctionne bien avec les méthodes synchrones, mais pas quand vous utilisez des appels asynchrones –
Merci je l'ai corrigé en mettant quelques instructions conditionnelles dans la boucle while – Bitsian