Je veux appeler le travailleur de fond de manière synchrone. Je souhaite que l'exécution du code se termine lorsque le travail d'arrière-plan a terminé son exécution. Mon code pour Backgroundworker est ici:
{ BackgroundWorker worker = new BackgroundWorker(); worker.DoWork += DoWork; worker.RunWorkerCompleted += RunWorkerCompleted; ... worker.RunWorkerAsync(); //wait for execution to end }
3 Réponses :
Si vous ne voulez pas que votre code soit exécuté de manière asynchrone, ne le mettez pas dans un menuiserie Cependant, s'il y en a quelques Raison obscure Pourquoi vous avez absolument besoin d'avoir le code dans le collecker code> code>, vous pouvez utiliser les éléments suivants: p> code> ...
Votre code qui serait après // attendre que l'exécution soit enfoncé code> doit être placé dans la méthode
travailleur_runworkercompled code>. p>
crée un formulaire de demande Windows. En cliquant sur Button1, il doit exécuter de manière synchrone
et les retours engagent l'interface utilisateur, afin que l'utilisateur ne soit pas capable de faire quoi que ce soit avant la fin de la tâche du travail d'arrière-plan. p>
@Ghostcat Oui, tu as raison. J'ai fait de mon mieux pour répondre à la question à travers mon post.
@Ghostcat Merci pour votre conseil, j'ai édité le code et j'ai essayé de le présenter plus attrayant.
Je voudrais davantage "raccourcir" les organes de méthode vides - mais beaucoup mieux maintenant ;-)
Quel est le point d'utiliser un travailleur d'arrière-plan si vous l'attendez de manière synchrone?
Pourquoi ne pas simplement déplacer la partie du code que vous souhaitez exécuter après que le travailleur d'arrière-plan soit terminé sous l'événement RunworkerChased?
Le code que je veux exécuter donne une erreur lorsqu'il est exécuté dans le même thread, donc j'ai besoin que ce code soit exécuté à travers le travailleur d'arrière-plan.
@Ahmedmasud: Vous devriez vous concentrer sur la fixation de cette erreur, pas sur la construction de contours.
@Kookiz - Pour commencer, un ouvrier d'arrière-plan Async ne bloquera pas l'interface utilisateur. En outre, l'OP peut vouloir effectuer d'autres étapes intermédiaires mais a décidé de ne pas montrer ces étapes dans l'exemple.
@Chrisgessler Mais si vous attendez de manière synchrone pour que le travailleur d'arrière-plan se termine, vous bloquerez l'interface utilisateur de toute façon
Quelle version de C # utilisez-vous? 4? 4.5? 5?
@Kookiz - pas nécessairement. msdn.microsoft.com/en-us/library/hh191443.aspx
@Chrisgessler "Programmation asynchrone avec Async et attendre", comment est-ce synchrone? ;)
@Chrisgessler: vous attendez ne fait pas une attente synchrone. Il ressemble à un code synchrone ...
@Chrisgessler: Il n'y a pas de C # 4.5. Il y a C # 4, C # 5 et .NET 4 et .NET 4.5. Ne confondez pas ceux-ci.
J'utilise ce code dans le service WCF afin que l'interface utilisateur ne soit pas émettre ici et m en utilisant .NET 3.5
@Chrisgessler: Vous l'avez impliqué, en disant que l'attente de manière synchrone à la fin d'un ouvrier de fond ne bloque pas nécessairement l'interface utilisateur et la liaison à l'introduction à
attendre code> et
async code>.
@Danielhilgarth - L'OP (et les autres) a utilisé le mot "synchroneux" pas moi. Je suis simplement en train de deviner à ce que l'OP a vraiment besoin / veut malgré le mot choisi. La question initiale ne fait aucune mention d'un UI, d'un service Windows, etc., il est donc difficile de savoir quel problème j'essaie vraiment de résoudre, comme avec beaucoup de ces questions, donc parfois, il est parfois nécessaire de lire entre les lignes. Si ASYNC / SYNC ATTENDRE N'ATRAIT PAS vraiment, le problème peut être résolu de différentes manières, alors qu'une attente de synchronisation limite les possibilités.
@Danielhilgarth - En fait, il y avait un "C # 4.5" pour un très bref moment à temps, au moins c'est ce que tout le monde l'appelait avant l'annonce officielle de Microsoft. Mais tu as raison, c'était en fait C # 4 + .NET 4.5. Je pense que les gens l'ont appelé que parce qu'il était plus facile de dire que "C # 4 à l'aide du complicateur .NET 4.5". DotNetCurry.com/showarticle.aspx?id=797