2009-07-21 7 views
1

J'ai hébergé un service WCF dans le service Windows. J'ai une application de console pour laquelle j'ai ajouté une référence de service WCF et généré un client pour cela.Appel asynchrone pour service WCF hébergé dans le service Windows

Je peux appeler Sync au service, mais l'appel asynchrone ne semble pas fonctionner. Si j'attache le processus de serveur il ne frappe pas du tout le service.

client= new ServiceClient(); 
client.DoSomething();//Works fine 

client.DoSomethingAsync()//Doesnot work 

Est-ce un problème connu?

Répondre

1

L'appel asynchrone sera probablement démarré dans un fichier de travail en arrière-plan. Donc, ce qui pourrait arriver, c'est que votre thread asynchrone disparaisse parce que le thread de premier plan a fini son traitement. À moins que vous n'ayez une certaine logique après avoir fait cet appel pour attendre la réponse, ou continuer avec un autre travail sur votre thread principal, le thread d'arrière-plan n'a pas le temps d'être créé avant que l'application se termine.

Cela peut être facilement testé en ajoutant Thread.Sleep après l'appel asynchrone. Un symptôme de ce problème est que votre service démarre/s'arrête de façon inattendue et Windows renvoie une erreur.

+0

Thanks..it travaillé après l'ajout de sommeil –

+0

C'est génial! Heureux d'avoir pu aider – pavsaund

0

Lorsque vous avez généré le client, avez-vous coché la case pour spécifier "Générer des opérations asynchrones"?

+0

oui je peux voir les méthodes Async dans le code généré –

+0

Donc, pour être tout à fait clair, cela est la méthode DoSomethingAsync dans le client qui a été généré automatiquement pour la méthode DoSomething dans le service lui-même? Vous n'avez pas essayé d'exposer vous-même une méthode DoSomethingAsync dans le service? –

+0

yes..DoSomethingAsync méthode dans le client qui a été générée automatiquement pour la méthode DoSomething dans le service –

0

A partir du code affiché, je suppose que vous n'avez pas configuré de gestionnaires pour gérer la réponse de la méthode asynchrone. Vous aurez besoin de quelque chose comme l'exemple au bas de ce msdn post où vous utilisez AddHanlder pour gérer la réponse.

Quelque chose comme ci-dessous avant de faire l'appel async:

AddHandler client.DoSomethingCompleted, AddressOf DoSomethingCallback 

Avec une méthode pour traiter la outome:

Private Shared Sub DoSomethingCallback(ByVal sender As Object, ByVal e As DoSomethingCompletedEventArgs) 

     'Do something with e.Result 
     MsgBox e.Result 

End Sub 
0

Si vous avez un appel à

client.DoSomethingAsync()//Doesnot work 

alors avez-vous spécifié un gestionnaire pour l'événement de rappel terminé? Qu'est-ce qui se passe, c'est que l'appel asynchrone se déclenche, mais comment cela vous renvoie-t-il des résultats ??? Vous devrez fournir une méthode de gestionnaire pour cela - connectez-le au gestionnaire d'événements DoSomethingCompleted! Dans cette méthode, vous obtiendrez les résultats de l'appel asynchrone et vous pourrez faire avec eux tout ce que vous devez faire.

Marc