如何确定流程现在已经完成,结束关闭此事件OutputDataReceived in C#
我正在使用C#的如何确定流程现在已经完成,结束关闭此事件OutputDataReceived in C#,c#,asp.net,C#,Asp.net,我正在使用C#的Process来执行opencmd和fire命令。完成此过程后,我想使用由OutputDataReceived填写的列表进一步使用 但是,我无法确定过程现在已经完成,您可以使用列表 我得到了这个错误集合已修改枚举操作可能无法执行 代码 String exeFileName = "cmd"; List<string> list = new List<string>(); ProcessStartInfo inf
Process
来执行opencmd
和fire命令。完成此过程后,我想使用由OutputDataReceived
填写的列表进一步使用
但是,我无法确定过程现在已经完成,您可以使用列表
我得到了这个错误<代码>集合已修改枚举操作可能无法执行
代码
String exeFileName = "cmd";
List<string> list = new List<string>();
ProcessStartInfo info = new ProcessStartInfo(exeFileName);
info.Arguments = @"/c myCommand";
info.RedirectStandardOutput = true;
info.RedirectStandardError = true;
info.UseShellExecute = false;
Process proc = new Process();
proc.StartInfo = info;
// Set our event handler to asynchronously read the sort output.
proc.OutputDataReceived += new DataReceivedEventHandler(proc_OutputDataReceived);
proc.ErrorDataReceived += new DataReceivedEventHandler(proc_ErrorDataReceived);
try
{
proc.Start();
proc.BeginErrorReadLine();
proc.BeginOutputReadLine();
// i don't want to pass some time interval here like WaitForExit(1000)
// cause command takes dynamic time
proc.WaitForExit();
if (!proc.HasExited)
{
proc.Kill();
}
// this throws error like "collection-was-modified-enumeration-operation-may-not-execute"
foreach(i in list)
{
//logic
}
}
catch (Exception ex)
{
throw;
}
}
static void proc_ErrorDataReceived(object sender, DataReceivedEventArgs e)
{
if (e.Data != null)
{
// logic
list.Add(e.data);
}
}
static void proc_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
// logic
list.Add(e.data);
}
String exeFileName=“cmd”;
列表=新列表();
ProcessStartInfo信息=新的ProcessStartInfo(exeFileName);
info.Arguments=@“/c myCommand”;
info.RedirectStandardOutput=true;
info.RedirectStandardError=true;
info.UseShellExecute=false;
Process proc=新流程();
proc.StartInfo=info;
//将事件处理程序设置为异步读取排序输出。
proc.OutputDataReceived+=新的DataReceivedEventHandler(proc\u OutputDataReceived);
proc.ErrorDataReceived+=新的DataReceivedEventHandler(proc\u ErrorDataReceived);
尝试
{
proc.Start();
proc.BeginErrorReadLine();
进程BeginOutputReadLine();
//我不想像WaitForExit(1000)那样在这里度过一些时间间隔
//原因命令需要动态时间
进程WaitForExit();
如果(!进程已退出)
{
proc.Kill();
}
//此抛出类似“集合已修改”的错误枚举操作可能无法执行
foreach(列表中的i)
{
//逻辑
}
}
捕获(例外情况除外)
{
投掷;
}
}
静态void proc_ErrorDataReceived(对象发送方,DataReceivedEventArgs e)
{
如果(如数据!=null)
{
//逻辑
列表。添加(如数据);
}
}
静态void proc_OutputDataReceived(对象发送方、DataReceivedEventArgs e)
{
//逻辑
列表。添加(如数据);
}
使用for循环,而不是foreach。。尤其是在向后删除工作时。您可以尝试等待进程退出事件,但我看不出在进程退出后,EventHandler收到的错误和数据如何更改您的列表。当WaitForExit返回时,进程已退出。除非您在初始流程中随后开始了一个进一步的流程,而不是等待它返回。您在//逻辑中做什么?您是否在正在处理的列表中添加/删除项目?如果是:尝试将添加的项目放入“newitems”列表,将要删除的项目放入“itemsToDelete”列表。在您完成第一个foreach(列表中的i)循环“newItems”和“itemsToDelete”并将它们从初始列表中添加/删除后。谢谢@ThomasVoß,而foreach循环即使在处理程序“OutputDataReceived”被调用之后也会启动。所以,它在列表中添加了项目。Alternet解决方案就是这个过程。WaitForExit(1000*60*5)但我不知道需要等待多长时间,也不知道如何知道这个过程已经完成。这个过程。WaitForExit(1000*60*5)对于您的解决方案来说无论如何都不应该起作用,因为它不是一个固定的等待时间。如果进程退出,它将提前返回。否则,即使进程仍在运行,它也将在等待时间后最晚退出。请使用for循环,而不是foreach。。尤其是在向后删除工作时。您可以尝试等待进程退出事件,但我看不出在进程退出后,EventHandler收到的错误和数据如何更改您的列表。当WaitForExit返回时,进程已退出。除非您在初始流程中随后开始了一个进一步的流程,而不是等待它返回。您在//逻辑中做什么?您是否在正在处理的列表中添加/删除项目?如果是:尝试将添加的项目放入“newitems”列表,将要删除的项目放入“itemsToDelete”列表。在您完成第一个foreach(列表中的i)循环“newItems”和“itemsToDelete”并将它们从初始列表中添加/删除后。谢谢@ThomasVoß,而foreach循环即使在处理程序“OutputDataReceived”被调用之后也会启动。所以,它在列表中添加了项目。Alternet解决方案就是这个过程。WaitForExit(1000*60*5)但我不知道需要等待多长时间,也不知道如何知道这个过程已经完成。这个过程。WaitForExit(1000*60*5)对于您的解决方案来说无论如何都不应该起作用,因为它不是一个固定的等待时间。如果进程退出,它将提前返回。如果没有,它将在等待时间后退出,即使进程仍在运行。