gpt4 book ai didi

c# - 在循环中使用 Task.Factory.StartNew

转载 作者:太空宇宙 更新时间:2023-11-03 17:39:39 25 4
gpt4 key购买 nike

我正在尝试掌握 .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();
}

我得到的输出:

100  24
100 23
...
100 14
100 25
done in 00:00:12.0044853

我不明白为什么所有的 i 都一样,为什么是 100?直觉上我希望它们是 0~99,但不是全是 100。

最佳答案

想象一下执行顺序。您指示每个任务在一秒钟后输出 i,但到那时循环已完成执行且 i 等于 100。

您可以使用以下 StartNew 重载来传递将由您的操作使用的 state 对象:

public Task StartNew(Action<object> action, object state)

并执行以下操作:

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));
}

关于c# - 在循环中使用 Task.Factory.StartNew,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33870164/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com