foreach (System.Diagnostics.Process thisproc in System.Diagnostics.Process.GetProcessesByName(fileName[i-1]))
 {
        /*for(;;)
        {
             ;
        }*/

        if (!thisproc.CloseMainWindow())
        {
            thisproc.Kill();
        }
        i = i --;
 }
i是打开多个进程时的自增值,是全局变量。
上面代码执行的操作:关闭打开的多个文件的进程。执行后,没反应;
于是单步执行,到foreach时,只进行了foreach()内的操作后,就直接跳过循环了。
开始以为是if语句不满足,后来加入红字部分,发现根本不执行!求高手给我解答,谢谢!

解决方案 »

  1.   

    在foreach循环中,是不能更改 循环内容的值的。 
      

  2.   

    说明你的System.Diagnostics.Process.GetProcessesByName(fileName[i-1])里面没有数据你可以先调试System.Diagnostics.Process.GetProcessesByName(fileName[i-1])
      

  3.   

    System.Diagnostics.Process myproc= new System.Diagnostics.Process();
    foreach (Process thisproc in Process.GetProcessesByName(processName)) {
    if(!thisproc.CloseMainWindow()){
    thisproc.Kill();
    }}
    foreach中修改不了集合
    for从大到小操作
      

  4.   

    遇到过类似的问题,你看一下你的System.Diagnostics.Process.GetProcessesByName(fileName[i-1])是否返回为空
      

  5.   

    1、4楼说过了 foreach中不能修改集合中的值
      

  6.   

    是的 thisproc的值是null 
      

  7.   

    但是,我修改如下,并且只开一个文件,怎么还是没反应?
    foreach (System.Diagnostics.Process thisproc in System.Diagnostics.Process.GetProcessesByName(fileName[0]))
                        {
                            if (!thisproc.CloseMainWindow())
                            {
                                thisproc.Kill();
                            }
                          //  i = i -1;
                        }
      

  8.   

    foreach循环中,申明的去取集合中对象的对象是不能直接改变值的
      

  9.   

    我用到的不是ProcessName一个字符串,而是一个字符串数组,我也用for循环试过了:
    for (; i>=0; --i)
                    {
                        System.Diagnostics.Process[] thisproc = System.Diagnostics.Process.GetProcessesByName(fileName[i]);
                        if (!thisproc[i].CloseMainWindow())
                        {
                            thisproc[i].Close();
                        }
                    }
    错误提示:if (!thisproc[i].CloseMainWindow())数组越界
      

  10.   

    我没试过这样的循环写法:--i,应该改成i--吧,要不,会不会在开始循环时就使得i=-1了???
      

  11.   

    i是打开多个进程时的自增值,是全局变量。
    因为最后一次多自增1,所以现在用--i;如果打开3个文件i就是3(fileName[]下表是0、 1、 2)
      

  12.   

    这里thisproc是关于fileName[i]的所有进程么似乎,然后只操作thisproc[i]正确么
    不应该把整个thisproc都关掉么
      

  13.   

    接上,例如
    i=3
    System.Diagnostics.Process[] thisproc = System.Diagnostics.Process.GetProcessesByName(fileName[i]);
    假设得到的thisproc只有一个进程,然后去thisproc[i].Close();很明显数组就越界了.
    我昨天貌似也回过lz的问题,推荐lz还是不要把循环计数定义成全局了.
      

  14.   

    恩,谢谢k0mmDu,我不是很清楚Process.GetProcessesByName(fileName[i]),fileName[i]只是一个文件的绝对路径,获得的不是一个Process类型的结构体thisproc么?
    还有,我执行代码的时候,thisproc[i].Close()里面的i值是0,也就是按你说的第一个进程,怎么还是出现越界?
      

  15.   

    你能保证返回thisproc确定有值,不是null么
    还有就算有值的话也不该用thisproc[i]进行操作吧.
      

  16.   

    Process.GetProcessesByName(string processName)
            // 参数:
            //   processName:
            //     该进程的友好名称。
    明显打一个文件名进去是不会出来东西的,需要输一个进程名进去.
      

  17.   

    我已经这样做了 System.Diagnostics.Process[] thisproc = System.Diagnostics.Process.GetProcessesByName("QQ.exe");
    但是thisproc的值仍然是一个null,我的进程里面有QQ.exe
    不知道是不是GetProcessByName我用的不对。我想知道怎样通过文件名去获得关闭该文件的方法。
      

  18.   

    直接点吧,LZ不要用foreach,用for OK?
    foreach里面的枚举是不可以更改的
      

  19.   

    qq就直接打qq不要exe
    System.Diagnostics.Process.GetProcessesByName("QQ");再试试看
      

  20.   

    http://msdn.microsoft.com/zh-cn/library/z3w4xdc9%28VS.80%29.aspx
    善用msdn和f1
      

  21.   

    lz是System.Diagnostics.Process.Start()开出来的进城吧.看看System.Diagnostics.Process.Start()返回值是什么?
    把返回的process放到一个list中,操作起来就没有这么麻烦了吧.