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

时间:2017-05-04 14:51:04

标签: c#

我在BG工作者DoWork()

中有这个
Process cmd = new Process();
cmd.StartInfo.FileName = "cmd.exe";
cmd.StartInfo.RedirectStandardInput = true;
cmd.StartInfo.RedirectStandardOutput = true;
cmd.StartInfo.RedirectStandardError = true;
cmd.StartInfo.CreateNoWindow = true;
cmd.StartInfo.UseShellExecute = false;
cmd.Start();

string fullcmd = "\"" + doorsExe + "\" -osUser -b \"" + "doors_" + genname + ".dxl" + "\"";

cmd.StandardInput.WriteLine(fullcmd);
cmd.StandardInput.Flush();
cmd.StandardInput.Close();
cmd.WaitForExit();

string result;

// HERE I WILL BECOME BLOCKED!
if ((result = cmd.StandardOutput.ReadToEnd()) != string.Empty)
    RaiseMessageEvent(result, Color.Gray);

现在我在

中使用了所有这些
if (!bgwImport.CancellationPending)
{
...
}

但当然,不能取消,因为有一个外部进程阻止所有东西。没关系,因为UI没有被阻止(这就是我使用BGW的原因)但是我实现了一个"取消"按钮不起作用。

如何停止

cmd.StandardOutput.ReadToEnd()

提前致谢!

1 个答案:

答案 0 :(得分:0)

同步/异步非常清楚,感谢提示。但是,我已经在后台工作,所以异步并不重要。

最后以某种方式解决了,以防任何人像我一样从头上拔头发。

非常感谢-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;
                }

            }