在执行阻止方法期间强制返回控制

时间:2016-05-26 10:48:15

标签: c# asynchronous blocking

我通过阻塞的C#Interop执行外部方法SaveCurrentDocument()。该方法弹出一个对话框,要求用户"另存为"。我需要在此窗口中自动输入内容并按OK。我的问题是该方法是阻止的。所以我不能做到以下几点:

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

如何从阻止方法强制返回控制?我目前的计划是启动一个BackgroundWorker并在其回调中执行该方法,从而阻止工作者而不是我的主线程。还有更好的方法吗?

2 个答案:

答案 0 :(得分:2)

我认为你不能在C#中的同一个线程中打破阻塞调用。 问题是,BackgroundWorker的CancelAsync()实际上并没有停止工作者,或者它的当前方法,它发送一个信号表明应该停止活动,如果你正在进行互操作阻塞调用,你就不会得到通过

虽然不理想,但您可以将interop调用委托给BackgroundWorker中的单独线程,同时保持手柄的便利性。 不幸的是,我对SendKeys几乎一无所知,所以我无法帮助你。

那就是说,正如M. Francis指出的那样,你可能最好先检查你是否可以通过C#解决方案编写文件(如果它是xlsx,docx,pdf,xml或者相当大的标准格式收集其他人),并使用标准化的解决方案来保存文件。

答案 1 :(得分:0)

我强烈建议您不要使用SendKeys。如果我在调用它时正在使用另一个程序或者有另一个窗口处于活动状态,那么键将发送到我正在做的任何事情,你的方法将无效。我建议如果你不得不使用SendKeys,不要使用依赖于需要用户输入输入的弹出窗口的SaveCurrentDocument。尝试使用StreamWriter或类似功能,这样就可以避免需要弹出窗口。如果您使用的是SaveFileDialog,也可以设置FileName属性。