我目前正在开发一项服务(此时它仍然是一个控制台应用程序,因为这更容易调试)。此服务的基本任务是观察新* .tif文件的文件夹。一旦应用程序在文件夹中找到.TIF文件,它就会使用以下代码启动另一个应用程序:
ProcessStartInfo command = new ProcessStartInfo(commandPath, commandParams);
command.RedirectStandardOutput=true;
command.UseShellExecute=false;
command.CreateNoWindow=true;
Process process = new Process();
process.startInfo = command;
process.Start();
process.WaitForExit();
然后,此控制台应用程序使用IrfanView将Multipage-TIF拆分为多个singlepage-TIF(我使用与上面基本相同的代码来执行此操作)。之后,我检查扫描图像上的条形码(使用zxing库)。然后将找到的条形码与Oracle数据库进行比较。之后,文件将转换为PDF并根据找到的条形码移动到特定位置。
当我自己启动它时,这个控制台应用程序工作正常,但是一旦“服务”启动它,它会在一段时间后暂停并且在我关闭“服务” - 控制台应用程序之前不做任何事情。然后它正常结束。
可能是什么问题?
我尝试禁用Oracle,数据库检查并且它有效。之后我禁用了我的Logging类,它也有效。所以我的猜测是,我以某种方式使用了太多的资源或类似的东西。但从哪里开始?
修改 一些额外的信息。我只是调试了这个过程,因为VS能够附加到一个进程来调试。挂起的命令是Console.WriteLine(从我的“服务”控制台调用的控制台应用程序中调用。子进程中的控制台只能有一定数量的行/字符吗?控制台输出流可以陷入僵局或这是什么?
答案 0 :(得分:0)
据我所知,您无法使用Windows服务与Windows应用程序进行交互。您可以使用您用于测试目的的windws控制台应用程序来执行此操作。但是当您切换到服务时,您的服务将无法与基于Windows的进程通信。
答案 1 :(得分:0)
好的,我找到了问题的答案。我在ProcessStartInfo对象上指定了我想要RedirectStandardOutput。问题是,我只在控制台应用程序执行结束时读取了输出,这导致了死锁。看起来缓冲区只能容纳1024个字符(according to this post)。只要您想在该缓冲区中写入更多内容,Console.WriteLine就会等待。如果你(像我一样)只在控制台应用程序执行结束时读取,那么这个缓冲区永远不会被清除,所以你得到了一个非常好的死锁; - )
希望这有助于其他人!欢呼声