我写了这个控制台程序:
static void Main(string[] args)
{
object sync = new object();
Thread[] t = new Thread[10];
int count = 0;
for (var i = 0; i < t.Length; i++)
{
t[i] = new Thread(() =>
{
lock (sync)
{
int inc = count;
Console.WriteLine("Count: {0}", count);
count = inc + 1;
}
});
}
foreach (var t1 in t)
{
t1.Start();
}
foreach (var t1 in t)
{
t1.Join();
Console.WriteLine("\nFinal Count= {0}", count);
Console.ReadKey();
}
}
我在输出中得到了这个结果:
Count: 0
Count: 1
Count: 2
Count: 3
Count: 4
Count: 5
Count: 6
Count: 7
Final Count= 7
Count: 8
Count: 9
当我多次运行应用程序时,我会得到更多不同的结果 但是我希望看到这个结果:
Count: 0
Count: 1
Count: 2
Count: 3
Count: 4
Count: 5
Count: 6
Count: 7
Count: 8
Count: 9
Final Count= 10
为什么会返回不同的结果,我该如何解决?
答案 0 :(得分:2)
尝试不要手动创建/终止这样的线程,这是一个耗时的操作,并且不能很好地扩展。
改为使用ThreadPool
。
或更好:使用任务,并使用await Task.WhenAll(list of your tasks)
答案 1 :(得分:1)
好吧,而不是这个:
foreach (var t1 in t)
{
t1.Join();
Console.WriteLine("\nFinal Count= {0}", count);
Console.ReadKey();
}
你应该写:
foreach (var t1 in t)
{
t1.Join();
}
Console.WriteLine("\nFinal Count= {0}", count);
Console.ReadKey();
否则你将参加比赛,你的代码将是不确定的。