2016-05-26 2 views
0

J'exécute une méthode externe SaveCurrentDocument() via C# Interop qui bloque. Cette méthode affiche une boîte de dialogue demandant aux utilisateurs de "Enregistrer sous". Je dois saisir automatiquement quelque chose dans cette fenêtre et appuyer sur OK. Mon problème est que la méthode est bloquante. Donc, je ne peux pas faire ce qui suit:Renvoyer de force le contrôle lors de l'exécution d'une méthode de blocage

SaveCurrentDocument(); // this is blocking 
SendKeys(savePath); 
SendKeys("{ENTER}"); 

Comment puis-je renvoyer de force le contrôle d'une méthode de blocage? Mon plan actuel était de commencer un BackgroundWorker et d'exécuter la méthode dans son rappel, bloquant ainsi le travailleur mais pas mon fil principal. Y a-t-il un meilleur moyen?

Répondre

2

Je ne pense pas que vous puissiez rompre un appel de blocage à l'intérieur du même thread en C#. Le problème est que CancelAsync() de BackgroundWorker n'arrête pas réellement le worker, ou sa méthode actuelle, il envoie un signal indiquant que l'activité doit être arrêtée, et si vous êtes dans un appel de blocage interop, vous n'allez pas traverser.

Bien que ce ne soit pas idéal, vous pouvez déléguer l'appel interop à un thread séparé depuis BackgroundWorker, tout en gardant le handle à portée de main. Malheureusement, je ne connais presque rien à SendKeys, donc je ne peux pas vous aider. Cela dit, comme l'a souligné M. Francis, vous feriez mieux de vérifier si vous pouvez obtenir une solution C# pour écrire le fichier (si c'est un format standard comme xlsx, docx, pdf, xml, ou plutôt grande collection d'autres), et en utilisant des solutions standardisées pour enregistrer le fichier.

0

Je vous recommande fortement de ne pas utiliser SendKeys pour cela. Si j'utilise un autre programme au moment où il est appelé ou si une autre fenêtre est active, les touches vont envoyer à ce que je fais et votre méthode ne fonctionnera pas. Je suggère de ne pas utiliser un SaveCurrentDocument qui repose sur une fenêtre contextuelle qui nécessite une entrée tapée par l'utilisateur si vous devez utiliser SendKeys. Essayez simplement d'utiliser un StreamWriter ou similaire afin d'éviter d'avoir besoin d'une fenêtre pop-up. Vous pouvez également définir la propriété FileName si vous utilisez un SaveFileDialog.