多线程行为奇怪的C#

本文关键字:多线程 | 更新日期: 2023-09-27 18:29:55

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

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__

究竟发生了什么,谁都能解释一下感谢

多线程行为奇怪的C#

请参阅Eric Lippert关于这个问题的精彩博客文章。

这是由于访问"修改后的闭包"造成的。

将循环体更改为:

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循环则没有固定。)

闭包。您必须在线程中复制变量,才能使其保持当前值,。

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

在for循环中创建Thread对象时,不会调用testThread-只要线程计划运行,就会调用该方法。这可能会在以后发生。

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