C# 多线程中的循环边界

C# 多线程中的循环边界,c#,multithreading,c#-3.0,C#,Multithreading,C# 3.0,我有一个主线程,它将一些其他线程嵌套在两个线程中 private void mainthread() { List<Thread> ts= new List<Thread>(); for (int w=0; w<7; w+=2) for (int h = 0; h < 5; h+=3) { T

我有一个主线程,它将一些其他线程嵌套在两个线程中

private void mainthread()
        {
            List<Thread> ts= new List<Thread>();

            for (int w=0; w<7; w+=2)
                for (int h = 0; h < 5; h+=3)
                {
                    Thread t = new Thread(delegate() { otherthreads(w, h); });
                    ts.Add(t);
                    t.Start();
                }
            for (int i = 0; i < ts.Count; i++)
                ts[i].Join();
        }

        private void otherthreads(int w, int h)
        {                    
            listBox1.Invoke(new singleparam(addtolistbox), new object[] { "w:" + w.ToString() + ",h:" + h.ToString() });        
        }
private void主线程()
{
列表ts=新列表();

对于(int w=0;w您的循环运行正常,但发生的情况是:代理知道它必须将
w
h
传递到
otherthreads()上
函数,但在实际调用之前,这些值不会被绑定。换句话说,在委托实际执行之前,它只知道必须使用
w
h
。在上一次迭代中,您要求委托执行,
w
h
最后一次递增在启动线程上,使其值分别为8和6。循环退出。然后,picomments稍后执行委托,现在的值为
w
h
…但现在的值为8和6

您可以通过使用局部变量“快照”
w
h
到代理周围最紧的范围,并适当地分配它们的值来避免这种情况:

for (int h = 0; h < 5; h+=3) 
{
    int h2=h;
    int w2=w;

    Thread t = new Thread(delegate() { otherthreads(w2, h2); });
    ts.Add(t);
    t.Start();
}
for(int h=0;h<5;h+=3)
{
int h2=h;
int w2=w;
线程t=新线程(委托(){otherthreads(w2,h2);});
ts.Add(t);
t、 Start();
}

因为循环变量已被匿名方法“捕获”,所以即使循环结束,您仍有其他线程获取其值。您是对的。但为什么初始值不在列表中。我的意思是w=0和h=0?可能是因为主线程在任何子线程开始之前继续执行,所以“初始值”价值观永远不会被执行。谢谢你的回答。