多线程行为奇怪的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__
究竟发生了什么,谁都能解释一下感谢
请参阅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
。