代码如下: 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 不是同步执行吗,为什么语句放到它之后就会出错呢?请问,即使同步委托也不是即时执行的吗??会受到其余线程的影响???
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 不是同步执行吗,为什么语句放到它之后就会出错呢?请问,即使同步委托也不是即时执行的吗??会受到其余线程的影响???
执行后,是马上执行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);的执行前后系统究竟还做了些什么工作.
什么意思?你所叫做“同步执行”的东西是个什么机制呢?如果并行操作,你认为这里写个Invoke就可以阻止别人修改asm?我不懂你是怎么理解同步的。说说看,你发明的同步执行是什么机制,凭什么、以及在那些范恩(进入哪一个操作时)就能阻止别人修改asm?
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大小的方法是另一个委托执行的.