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