阻塞方法执行期间强制return控制
Forcibly return control during execution of a blocking method
我正在通过阻塞的 C# Interop 执行外部方法 SaveCurrentDocument()
。该方法弹出一个对话框要求用户"Save As"。我需要在 window 中自动输入一些内容,然后按 OK。我的问题是该方法正在阻塞。所以我不能做以下事情:
SaveCurrentDocument(); // this is blocking
SendKeys(savePath);
SendKeys("{ENTER}");
如何从阻止方法强制return控制?我目前的计划是启动一个 BackgroundWorker
并在其回调中执行该方法,从而阻塞工作线程而不是我的主线程。有没有更好的方法?
我强烈建议您不要为此使用 SendKeys。如果我当时正在使用另一个程序,或者有另一个 window 处于活动状态,则这些键将发送到我正在做的任何事情,而你的方法将不起作用。如果您将不得不使用 SendKeys,我建议不要使用依赖于需要用户输入的弹出窗口的 SaveCurrentDocument。尝试只使用 StreamWriter 或类似的,这样您就可以完全避免需要弹出窗口。如果您使用的是 SaveFileDialog,您还可以设置文件名 属性。
我认为您无法在 C# 的同一线程内中断阻塞调用。
问题是,BackgroundWorker 的 CancelAsync() 实际上并没有停止 worker 或其当前方法,它发送了一个信号,表明 activity 应该停止,如果你在互操作阻塞调用中,你是不会通过。
虽然不理想,但您可以将互操作调用委托给 BackgroundWorker 中的单独线程,同时保持对它的处理方便。
不幸的是,我对 SendKeys 几乎一无所知,所以我帮不了你。
就是说,正如 M. Francis 指出的那样,您最好检查一下是否可以获得 C# 解决方案来编写文件(如果它是 xlsx、docx、pdf 等标准格式,xml,或相当大的其他集合),并使用标准化解决方案来保存文件。
我正在通过阻塞的 C# Interop 执行外部方法 SaveCurrentDocument()
。该方法弹出一个对话框要求用户"Save As"。我需要在 window 中自动输入一些内容,然后按 OK。我的问题是该方法正在阻塞。所以我不能做以下事情:
SaveCurrentDocument(); // this is blocking
SendKeys(savePath);
SendKeys("{ENTER}");
如何从阻止方法强制return控制?我目前的计划是启动一个 BackgroundWorker
并在其回调中执行该方法,从而阻塞工作线程而不是我的主线程。有没有更好的方法?
我强烈建议您不要为此使用 SendKeys。如果我当时正在使用另一个程序,或者有另一个 window 处于活动状态,则这些键将发送到我正在做的任何事情,而你的方法将不起作用。如果您将不得不使用 SendKeys,我建议不要使用依赖于需要用户输入的弹出窗口的 SaveCurrentDocument。尝试只使用 StreamWriter 或类似的,这样您就可以完全避免需要弹出窗口。如果您使用的是 SaveFileDialog,您还可以设置文件名 属性。
我认为您无法在 C# 的同一线程内中断阻塞调用。 问题是,BackgroundWorker 的 CancelAsync() 实际上并没有停止 worker 或其当前方法,它发送了一个信号,表明 activity 应该停止,如果你在互操作阻塞调用中,你是不会通过。
虽然不理想,但您可以将互操作调用委托给 BackgroundWorker 中的单独线程,同时保持对它的处理方便。 不幸的是,我对 SendKeys 几乎一无所知,所以我帮不了你。
就是说,正如 M. Francis 指出的那样,您最好检查一下是否可以获得 C# 解决方案来编写文件(如果它是 xlsx、docx、pdf 等标准格式,xml,或相当大的其他集合),并使用标准化解决方案来保存文件。