2009-06-24 7 views
1

permet de dire que je fais appel une méthode de service Web que je ne contrôle pas. Cette méthode prend beaucoup de temps à s'exécuter et quiconque a développé le service Web n'a pas pensé à inclure une version asynchrone.Faire une méthode Webservice asynchrone en C#/Winforms

Quelle est la meilleure façon de créer une enveloppe asynchrone pour un tel procédé en C#/WinForms?

Au moment où je me sers un ThreadPool pour exécuter la méthode webservice puis appeler un événement lorsque le webservice se termine. Quelque chose comme ça.

DoWorkAsync() { 
    Webservice.LongMethod() 
    WorkCompleteEvent() 
} 

Cependant, cela ne semble pas idéal. Par exemple, si j'essaie de modifier les contrôles de formulaire à partir du gestionnaire d'événements, j'obtiens un avertissement pour ne pas le faire à partir d'un thread différent, etc.

Quelqu'un a-t-il d'autres suggestions pour résoudre ce problème?

Répondre

6

Voir l'article MSDN sur How to: Make Thread-Safe Calls to Windows Forms Controls & aussi de Jon Skeet grand guide to threading plus particulièrement Threading in Windows Forms.

Citant Jon (Souligné par l'auteur):

Ne jamais invoquer une méthode ou une propriété sur un contrôle créé sur un autre thread autre que Invoke, BeginInvoke, EndInvoke ou CreateGraphics et InvokeRequired. Chaque contrôle est effectivement lié à un thread qui exécute sa pompe de message. Si vous tentez d'accéder à ou de modifier quelque chose dans l'interface utilisateur (par exemple en changeant la propriété Text) à partir d'un thread différent, vous courez le risque que votre programme se bloque ou se comporte mal d'une autre manière. Vous pouvez vous en sortir dans certains cas, mais seulement par chance aveugle. Heureusement, les méthodes Invoke, BeginInvoke et EndInvoke ont été fournies afin que vous puissiez demander au thread d'interface utilisateur d'appeler une méthode pour vous en toute sécurité.

0

Vous pouvez utiliser des délégués asynchrones pour appeler la méthode Web. Vous pouvez jeter un oeil à Asynchronous File Copy/Move in C# pour voir comment cela peut être fait. Considérez FileCopy est votre méthode Web (plutôt que d'une méthode de classe comme le montre l'exemple.)

Pour les erreurs inter-threads vous pouvez consulter crossthread operations error

1

La solution consiste à utiliser construit en solution asynchrone pour les services Web . Utilisez le webservice.BeginLongMethod() pour appeler et utiliser le IAsyncResult. Mais rappelez-vous que vous devez toujours utiliser les méthodes Invoke pour mettre à jour le code des formulaires Windows car il se trouve sur un thread différent.

Voir les articles suivants

http://www.informit.com/articles/article.aspx?p=29395&seqNum=4

http://msdn.microsoft.com/en-us/library/ms228972.aspx

Questions connexes