2017-08-31 16 views
1

J'ai quelques méthodes hubProxy.Invoke("Method", param) qui s'exécutent de manière asynchrone. Ils appellent tous la même méthode mais avec des arguments différents. Le problème est que tous s'exécutent correctement sur certains PC mais qu'un autre est confronté au problème que seul l'appel de la première méthode est exécuté alors que d'autres s'exécutent pour toujours. méthode ressembleConcentrateurs SignalR Appelez l'interblocage

if (!connectingTask.IsCompleted) 
{ 
    logger.Debug("awaiting for SignalR connection"); 
    await connectingtTask; 
    logger.Debug("SignalR connected"); 
} 
await hubProxy.Invoke("MethodName", args); 
logger.Debug("MethodName invoked"); 

connectingTask = Connection.Start(); et Connection est une instance de HubConnection.

Lorsque toutes les méthodes (2, par exemple) sont exécutés de sortie ressemble

Method 1: awaiting for SignalR connection 
Method 2: awaiting for SignalR connection 

Method 1: SignalR connected 
Method 1: MethodName invoked 

Method 2: SignalR connected 
Method 2: MethodName invoked 

Et quand seule la première méthode est sortie exécutée ressemble

Method 1: awaiting for SignalR connection 
Method 2: awaiting for SignalR connection 

Method 1: SignalR connected 
Method 2: SignalR connected 

Method 1: MethodName invoked 

Et Method 2 est dans l'impasse. Il n'y a pas de bloc dans le rappel Connection.StateChanged et aucune alarme après les méthodes Invoke(). Alors, qu'est-ce que je fais de mal et comment appeler la même méthode avec différents arguments de manière asynchrone correctement? Devrais-je avoir une file d'attente ou quelque chose?

Modifier Ou est-ce parce que j'envoie Invoke après await connectionTask? Je ne peux pas le vérifier maintenant car tout fonctionne correctement sur mon PC. Lien:

https://forums.asp.net/t/2024936.aspx?C+Client+Hangs+Deadlocks+Never+Returns

Modifier Et si concerne la méthode sur mon hub j'invoquez a Task type de retour.

Modifier Voici ma méthode de plaque tournante:

public Task Attach(string groupName) 
{ 
    return Groups.Add(Context.ConnectionId, groupName); 
} 

Je ne suis pas en mesure de tourner sur le traçage, car sur mon PC en général tout droit, mais une fois que je suis en mesure de recréer même question. Ne me souviens pas comment, je vais essayer de trouver plus tard, mais le problème est que je ne reçois pas de réponse lors de l'appel de concentrateurs Attacher la méthode qui est simplement attache l'utilisateur au groupe. Alors maintenant, au lieu de await hubProxy.Invoke("Attach", groupName) J'utilise hubProxy.Invoke("Attach", groupName). Je n'arrive pas à comprendre pourquoi ma première invocation est toujours réussie et je vois une réponse en trace mais après cela toutes les invocations de la même méthode échouent. Mais si j'attends un peu (environ 10 secondes et plus) et invoque cette méthode, je reçois de nouveau une réponse. On dirait que je suis capable d'invoquer la méthode des hubs seulement une fois par ~ 10 sec.

Je vais essayer de recréer ce problème et d'ajouter une trace complète.

+0

Activer le suivi. Afficher plus de code - ce que vous avez n'est pas suffisant pour dire ce qui se passe. – Pawel

+0

@Pawel terminé. J'ajouterai plus d'informations comme le traçage plus tard (1 ou 4 jours). –

Répondre

0

Au lieu d'utiliser

await hubProxy.Invoke("MethodName", args); 

essayer

hubProxy.Invoke("MethodName", args).Wait(500); 

ou tout autre délai que vous voudrais

J'ai eu la même question et attendre semblait avoir fixé, je sais attendent est le méthode préférée, mais parfois SignalR ne retourne pas correctement

+0

Oui, maintenant j'utilise juste Invoke et cela fonctionne très bien mais je devrais vraiment être sûr que l'utilisateur est attaché au groupe correctement. –