evi*_*ise 1 c# multithreading task
我试图掌握.NET中的多线程编程.
我想在for循环中创建100个任务,每个任务将睡眠1秒然后输出它创建的i和它的托管线程ID.完成所有任务后,我想输出经过的总时间.
所以我正在运行这个简单的代码
private static void Main(string[] args)
{
List<Task> tasks = new List<Task>();
for (int i = 0; i < 100; i++)
{
tasks.Add(Task.Factory.StartNew(() =>
{
Thread.Sleep(1000);
Console.WriteLine(i.ToString() + " " + Thread.CurrentThread.ManagedThreadId);
}));
}
Stopwatch watch = new Stopwatch();
watch.Start();
var final = Task.Factory.ContinueWhenAll(tasks.ToArray(), doneTasks =>
{
watch.Stop();
Console.WriteLine("done in {0}", watch.Elapsed);
});
Console.ReadKey();
}
Run Code Online (Sandbox Code Playgroud)
我得到的输出:
100 24
100 23
...
100 14
100 25
done in 00:00:12.0044853
Run Code Online (Sandbox Code Playgroud)
我不明白为什么所有的我都是一样的,为什么100?直觉上我希望它们是0~99,但不是全部100.
想象一下执行的顺序.您指示每个任务i在一秒钟后输出,但到那时循环已完成执行并且i等于100.
您可以使用以下StartNew重载来传递state将由您的操作使用的对象:
public Task StartNew(Action<object> action, object state)
Run Code Online (Sandbox Code Playgroud)
并执行以下操作:
for (int i = 0; i < 100; i++)
{
tasks.Add(Task.Factory.StartNew(o =>
{
int value = (int)o;
Thread.Sleep(1000);
Console.WriteLine(value.ToString() + " " + Thread.CurrentThread.ManagedThreadId);
}, i));
}
Run Code Online (Sandbox Code Playgroud)