代码如下:                    int nr = IndexOf((Control)sender);             
                    if (nr >= asm.Count)  //这里都没有检测到问题.
                    {
                        MessageBox.Show(nr.ToString() + "  asm.count=" + asm.Count.ToString());
                        return;
                    }                    //asm[nr].ISenter = 1; //这语句如果放在这里,就不会报错.  
             
                    if (asm[nr].funcs != null)
                        asm[nr].funcs.Invoke (asm[nr].name, 1);                    asm[nr].ISenter = 1;  //提示错误,nr大于asm.Count,这里没有任何语句修改nr和asm的值.
上面的代码,如果把asm[nr].ISenter = 1; 放到最后,就总是报错,而如果放到这个委托前,就不会报错.
外面有函数会修改asm的大小,但是Invoke 不是同步执行吗,为什么语句放到它之后就会出错呢?请问,即使同步委托也不是即时执行的吗??会受到其余线程的影响???

解决方案 »

  1.   

    Invoke是同步执行,但只能保证asm[nr].funcs.Invoke (asm[nr].name, 1);,可没说保证其他部分同步
      

  2.   

    我想问的是:asm[nr].funcs.Invoke (asm[nr].name, 1);
    执行后,是马上执行asm[nr].ISenter = 1; 还是需要等待某些操作完成后才执行asm[nr].ISenter = 1; 我目前遇到的问题是asm[nr].funcs.Invoke (asm[nr].name, 1);执行完后,执行了其余的操作,并修改了asm的大小,导致asm[nr].ISenter = 1; 
    语句出错.我就是不大明白
    asm[nr].funcs.Invoke (asm[nr].name, 1);的执行前后系统究竟还做了些什么工作.
      

  3.   


    什么意思?你所叫做“同步执行”的东西是个什么机制呢?如果并行操作,你认为这里写个Invoke就可以阻止别人修改asm?我不懂你是怎么理解同步的。说说看,你发明的同步执行是什么机制,凭什么、以及在那些范恩(进入哪一个操作时)就能阻止别人修改asm?
      

  4.   

    你的最后三句话实在是绕啊。什么意思呢?让我抛开一切什么同步不同步的名词,用最笨的顺序执行代码的思路看看这样的程序asm[n].func();既然你asm是个所在作用域可以被func()所修改的全局变量,那么asm[n]自己就可以把自己的父母给出卖了(修改了),那么下一句代码访问asm当然要根据被修改之后的asm来执行。这只是顺序编程而已,跟什么同步有什么关系?
      

  5.   

    回 sp1234:抱歉,我用词可能不妥当,实际执行的效果是这样的;如果这样写,程序不会报错,能正常运行asm[nr].ISenter = 1; //这语句如果放在这里,就不会报错.  
    if (asm[nr].funcs != null)  asm[nr].funcs.Invoke (asm[nr].name, 1);如果更换了顺序if (asm[nr].funcs != null)  asm[nr].funcs.Invoke (asm[nr].name, 1);
    asm[nr].ISenter = 1; //执行到这里时,编译器就要报错,提示nr值>asm.Count
    我可以保证asm[nr].funcs 没有修改asm的大小,我的感觉是虽然这2行代码是写在一个函数里面的,但是当编译器在执行了asm[nr].funcs后,并没有紧跟着执行asm[nr].ISenter = 1; 而是去执行了那个修改asm大小的函数,使得当执行到asm[nr].ISenter = 1; 时,而报错.我就是不怎么明白,为什么在执行asm[nr].funcs 后不紧随执行
    asm[nr].ISenter = 1;   ??asm[nr].funcs这个委托调用的方法很简单,只有一个,它没有修改asm的大小,而修改asm大小的方法是另一个委托执行的.