多线程行为怪C#!

时间:2014-11-11 09:23:03

标签: c# multithreading

这是我的应用程序来执行线程示例,但输出不是预期的,任何人都有任何线索请

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace OTS_Performence_Test_tool
{
    class Program
    {

        static void testThread(string    xx)
        {

            int count = 0;
            while (count < 5)
            {
                Console.WriteLine(xx );
                count++;

            }
        }

        static void Main(string[] args)
        {
            Console.WriteLine("Hello to the this test app ---");

            for (int i = 1; i<=3; i++)
            {

                    Thread thread = new Thread(() => testThread("" + i + "__"));

                thread.Start();

            }


            Console.ReadKey();
        }
    }
}

但是结果却是

3 __

3 __

3 __

3 __

3 __

3 __

3 __

3 __

3 __

3 __

4 __

4 __

4 __

4 __

4 __

任何人都可以解释的事情 感谢

3 个答案:

答案 0 :(得分:11)

See Eric Lippert's excellent blog post on this issue.

这是因为访问"modified closure"

将你的循环体改为:

for (int i = 1; i<=3; i++)
{
    int j = i;  // Prevent use of modified closure.
    Thread thread = new Thread(() => testThread("" + j + "__"));

    thread.Start();
}

(请注意,对于foreach循环,这已在.Net 4.5中修复,但对于for循环并未修复。)

答案 1 :(得分:3)

封闭。你必须在线程中复制变量以保持当前值,。

现在所有的线程都会以它们运行时的任何值读取变量i - 而不是调用thread.start时的值。

答案 2 :(得分:0)

在for循环中创建testThread对象时,不会调用

Thread - 只要线程被安排运行,就会调用该方法。这可能会在以后发生。

在您的情况下,线程在for循环结束后开始运行 - 到那时,i等于3.因此,使用值testThread调用3 3次。