除了执行许多其他功能外,我还在C#中编译了一个执行外部进程(wkhtmltoimage)的dll。在正常使用条件下,没有问题。进程开始,标准输入/输出都被正确重定向,我得到了我期望看到的输出。但是,执行wkhtmltoimage的此dll中的特定函数也可以从主线程以外的线程调用,在这种情况下,进程挂起。输入是相同的,当我观察生成的进程本身的内存使用时,stdin似乎正在工作,但我无法检查stdout或stderr,因为进程永远不会完成。我已经看过从一个线程执行一个进程是否有任何细微差别,但我还没有看到任何表明存在任何问题的东西。没有死锁,因为我只用一个线程进行测试,并且跟踪代码停止等待进程完成。该进程本身使用了大约一半的内存,当它正常执行时(大约15MB),所以我不知道线程内存是否有限制,这个生成的进程被归入?
任何想法都会非常有用。我已经尝试过许多方法让它起作用,但无济于事......
Process p = new Process();
StreamWriter stdin;
p.StartInfo.FileName = Path.Combine(this.imageConvertBinPath, "wkhtmltoimage.exe");
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.Arguments = String.Format("--debug-javascript --stop-slow-scripts --window-status complete --crop-h {0} --crop-w {1} - \"{2}\"", this.Height, this.Width, imgFilePath);
p.Start();
stdin = p.StandardInput;
stdin.AutoFlush = true;
stdin.Write(testHTML);
stdin.Close();
p.WaitForExit(15000);
此代码在非线程环境中正常工作,但在最终在线程环境中被杀死之前挂起在p.WaitForExit上。这是运行单个线程(用于测试),而不是处理器或内存密集型进程。
通过stdin传递的输入在两种情况下是相同的,我甚至测试了非常琐碎的" hello world"输入
答案 0 :(得分:0)
好的,现在已修复。我将fusioncharts javascript通过stdin传递给wkhtmltoimage,并且fusioncharts.js文件中显然有3个字符是unicode,当作为独立应用程序运行时,wkhtmltoimage无法读取。奇怪的是,当我运行这个完全相同的程序作为服务,或通过IIS下的主.NET应用程序执行wkhtmltoimage时,它工作正常。不知道为什么它在一个上下文中运行(作为服务运行)而不是在另一个环境中运行(作为独立应用程序运行),但它现在正在工作。