我有以下 C# 代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
class Program
{
static async Task Main(string[] args)
{
IEnumerable<Task> tasks = Enumerable.Range(0, 2)
.Select(_ => Task.Run(() =>
{
Task.Delay(10);
Console.Write("*");
}));
await Task.WhenAll(tasks);
Console.Write($"{tasks.Count()} stars!");
}
}
Run Code Online (Sandbox Code Playgroud)
它是不确定的,我让它打印两种输出:
**2 stars!******2 stars!我可以理解星星可能处于不同的位置,但我不明白为什么有 4 颗星星?在我看来,它应该打印 2 颗星。
tasks是一个IEnumerable<T>,意味着它是延迟执行的。因此,每当您迭代它时,它都会创建一组新的任务。当您调用 时tasks.Count(),您创建了一组新任务,这些任务可能会也可能不会在打印消息之前完成。
正确的修复方法是:
var tasks = Enumerable.Range(0, 2)
.Select(_ => Task.Run(() =>
{
Task.Delay(10);
Console.Write("*");
}))
.ToList(); // create a list
Run Code Online (Sandbox Code Playgroud)