Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#中止由cmd.StandardOutput.ReadToEnd()启动的外部进程_C# - Fatal编程技术网

c#中止由cmd.StandardOutput.ReadToEnd()启动的外部进程

c#中止由cmd.StandardOutput.ReadToEnd()启动的外部进程,c#,C#,我在BG的工人嫁妆里有这个 现在我把这些都用在了 if (!bgwImport.CancellationPending) { ... } 但当然,不能取消,因为有一个外部进程会阻止所有内容。没关系,因为UI没有被阻止(这就是我使用BGW的原因),但我实现了一个“取消”按钮,但它不起作用 我怎么能停下来 cmd.StandardOutput.ReadToEnd() 提前谢谢 使用sync/async非常清晰,感谢您的提示。然而,我已经在后台工作,所以异步目前并不重要 最终以某种方式解决了,以防

我在BG的工人嫁妆里有这个

现在我把这些都用在了

if (!bgwImport.CancellationPending)
{
...
}
但当然,不能取消,因为有一个外部进程会阻止所有内容。没关系,因为UI没有被阻止(这就是我使用BGW的原因),但我实现了一个“取消”按钮,但它不起作用

我怎么能停下来

cmd.StandardOutput.ReadToEnd()

提前谢谢

使用sync/async非常清晰,感谢您的提示。然而,我已经在后台工作,所以异步目前并不重要

最终以某种方式解决了,以防有人像我一样把头发从头上拔下来

无论如何,感谢-1,非常令人鼓舞

在任何情况下都会中止,我在TaskManager登记,Doors工作正常。然而,我花了一个小时来研究如何捕获重定向的输出,但没有成功。始终返回NULL。我只是放弃了,我只需要取消那个过程

            String command = "\"" + doorsExe + "\" -osUser -b doors_" + genname + ".dxl";
            ProcessStartInfo cmdsi = new ProcessStartInfo("cmd.exe", "/c" + command);

            cmdsi.CreateNoWindow = true;
            cmdsi.UseShellExecute = false;

            Process cmd = new Process();
            cmd = Process.Start(cmdsi);

            while (!cmd.HasExited)
            {

                if (bgwImport.CancellationPending)
                {
                    e.Cancel = true;
                    return;
                }

            }

切换到stderr/stdout的异步读取可能会修复死锁问题。我做了一个简单的版本,对我来说很有用。要使它像您的代码一样工作,只需更改
(发送方,args1)=>Console.WriteLine(args1.Data)
将数据附加到某个字符串,然后在最后该字符串将与您期望的
结果相同。另外请注意,您给了我们一个提示,我上面的评论是修复您的“实际”死锁问题,对你所提出的问题的回答是把一个过程对象附加到<代码>门性别> /COD>和它。在到达大锤解决方案之前,考虑修复代码中的错误。当您要求进程在开始读取其输出之前先退出时,此程序很可能会死锁。伙计们,请。。doors.exe这是IBM制造的一个可怕的烂摊子。我只是试图捕捉一些信息,实际上会启动隐藏的线程来编写文件,等等。这是不可能(至少不容易)进行交互的。当我在启动过程中关闭(强制)我的应用程序时,它只是关闭而没有任何抱怨。因此,我试图找出如何取消相同的.NET做得很好。
            String command = "\"" + doorsExe + "\" -osUser -b doors_" + genname + ".dxl";
            ProcessStartInfo cmdsi = new ProcessStartInfo("cmd.exe", "/c" + command);

            cmdsi.CreateNoWindow = true;
            cmdsi.UseShellExecute = false;

            Process cmd = new Process();
            cmd = Process.Start(cmdsi);

            while (!cmd.HasExited)
            {

                if (bgwImport.CancellationPending)
                {
                    e.Cancel = true;
                    return;
                }

            }