我一直在尝试实现类似这样的多线程:
static void Main(string[] args)
{
List<Task> tskList = new List<Task>();
for (int i = 0; i < 100; i++)
{
Task taskTemp = new Task(() => { Display(i); });
taskTemp.Start();
tskList.Add(taskTemp);
//Thread.Sleep(10);
}
Task.WaitAll(tskList.ToArray());
}
public static void Display(int value)
{
Thread.Sleep(1000);
Console.WriteLine(value);
}
没有Thread.Sleep(10)部分,我输出打印为100次“100”而不是0到99,我得到的睡眠时间为10毫秒。 我的猜测是,这可能会发生,因为系统调度线程所需的时间以及线程即将实际启动的时间,该值已达到100。 如果我放足够的等待时间(比如1000毫秒而不是10毫秒),是否可以保证没有这个问题?或者我应该怀疑当CPU利用率太高时系统可能需要更多时间来安排线程?解决这个问题的最佳方法是什么?
提前感谢任何输入!
答案 0 :(得分:2)
你应该添加一个局部变量来保存'i',例如:
for (int i = 0; i < 100; i++)
{
var t = i;
Task taskTemp = new Task(() => { Display(t); });
taskTemp.Start();
tskList.Add(taskTemp);
//Thread.Sleep(10);
}
答案 1 :(得分:1)
只需复制一份&#34; i&#34;到&#34; i1&#34;并将其用作局部变量。 &#34; I&#34;总是改变,这就是为什么你得到100 100 100 ......:
private static void Main(string[] args)
{
var tskList = new List<Task>();
for (var i = 0; i < 100; i++)
{
var i1 = i;
var taskTemp = new Task(() => { Display(i1); });
taskTemp.Start();
tskList.Add(taskTemp);
}
Task.WaitAll(tskList.ToArray());
}
public static void Display(int value)
{
Thread.Sleep(1000);
Console.WriteLine(value);
}