如何确定流程现在已经完成,结束关闭此事件OutputDataReceived in 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

我正在使用C#的
Process
来执行open
cmd
和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)对于您的解决方案来说无论如何都不应该起作用,因为它不是一个固定的等待时间。如果进程退出,它将提前返回。如果没有,它将在等待时间后退出,即使进程仍在运行。