我在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()
提前致谢!
答案 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;
}
}