请查看下面的代码示例:
这个示例的预期输出应该类似于:
然而,当您运行此代码时,它会显示如下内容:
我可以理解线程执行的顺序可能不同,因此计数不会以轮询方式增加。但是,我无法理解为什么所有的
难道不是不同的对象与不同的线程一起使用吗?
public class Sample
{
public int counter { get; set; }
public string ID;
public void RunCount()
{
for (int i = 0; i < counter; i++)
{
Thread.Sleep(1000);
Console.WriteLine(this.ID + " : " + i.ToString());
}
}
}
class Test
{
static void Main()
{
Sample[] arrSample = new Sample[4];
for (int i = 0; i < arrSample.Length; i++)
{
arrSample[i] = new Sample();
arrSample[i].ID = "Sample-" + i.ToString();
arrSample[i].counter = 10;
}
foreach (Sample s in arrSample)
{
ThreadPool.QueueUserWorkItem(callback => s.RunCount());
}
Console.ReadKey();
}
}
这个示例的预期输出应该类似于:
Sample-0 : 0
Sample-1 : 0
Sample-2 : 0
Sample-3 : 0
Sample-0 : 1
Sample-1 : 1
Sample-2 : 1
Sample-3 : 1
.
.
.
然而,当您运行此代码时,它会显示如下内容:
Sample-3 : 0
Sample-3 : 0
Sample-3 : 0
Sample-3 : 1
Sample-3 : 1
Sample-3 : 0
Sample-3 : 2
Sample-3 : 2
Sample-3 : 1
Sample-3 : 1
.
.
.
我可以理解线程执行的顺序可能不同,因此计数不会以轮询方式增加。但是,我无法理解为什么所有的
ID
都显示为Sample-3
,而执行显然是相互独立的。难道不是不同的对象与不同的线程一起使用吗?
s
而不是它的值。当线程执行时,迭代已经完成,s
保留了它的最后一个值。 - Zarat