【发布时间】:2018-02-24 13:16:33
【问题描述】:
我需要用ProcessStartInfo打印一个pdf文件。
string docInvoicePath = @"[Path]";
string printername = "\"PRN-OFFICE\"";
string driver = "\"Xerox Global Print Driver PS\"";
string port = "\"[IP]\"";
ProcessStartInfo psInfo = new ProcessStartInfo
{
FileName = @"""C:\Program Files (x86)\Adobe\Reader 9.0\Reader\AcroRd32""",
Arguments = String.Format("/s /o /h /t " + docInvoicePath + " " + printername + " " + driver + " " + port),
Verb = "print",
WindowStyle = ProcessWindowStyle.Hidden,
CreateNoWindow = true,
UseShellExecute = false
};
Process process = Process.Start(psInfo);
process.WaitForExit(6000);
if (process.HasExited == false)
{
process.Kill();
}
process.Close();
filename 和 arguments 是正确的,它们在粘贴到 cmd 时有效。
代码可以正常工作,但是在Process.Start 之后,当涉及到WaitForExit 时,程序没有完成。我收到超时错误:
System.Threading.ThreadAbortException:线程被中止。 在 System.Threading.WaitHandle.WaitOneNative(SafeHandle waitableSafeHandle,UInt32 毫秒超时,布尔值 hasThreadAffinity,布尔退出上下文) 在 System.Threading.WaitHandle.InternalWaitOne(SafeHandle waitableSafeHandle,Int64 毫秒超时,布尔值 hasThreadAffinity,布尔退出上下文) 在 System.Diagnostics.Process.WaitForExit(Int32 毫秒)...
我搜索并尝试了一些操作,例如设置 <httpRuntime executionTimeout="300"/> 并遇到 500 或类似 process.WaitForExit(6000); 及更高的代码,没有例外但没有打印。
是有错误还是我遗漏了什么?
编辑: 我在上面更改了我的代码块。现在代码在调试模式下工作,但发布时它仍然不会打印我的文档。我也尝试使用不同的用户。 在调试模式下,代码打印文档但在 kill 查询中运行。
ProcessStartInfo.Verbs 返回一个参数异常,但我不知道为什么。
【问题讨论】:
-
你在阻塞主线程吗?
-
我不这么认为,我该如何检查?
-
我只是想知道为什么它应该被中止,如果在 ASP.NET 中我不确定如果你阻塞主线程这么久会发生什么。在普通的 .net/WinForms 应用程序中,您的 GUI 将无响应。但是在 ASP 上——我真的不知道是否有机制可以中止长时间运行的东西。您是否必须出于某种原因等待退出?如果不只是省略它。如果是,请尝试在工作线程上执行所有这些操作,看看是否也发生了中止。
-
没有 WaitForExit 它完美地运行代码但没有任何反应/被打印
-
嗯,对不起。我真的不熟悉 ASP。我这边的任何建议都只适用于“普通”的 .net 应用程序。不过,我怀疑你必须生成一个后台任务。