为什么这段代码打印 4 颗星而不是 2 颗星?

Lor*_*eno -1 .net c#

我有以下 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 颗星。

Gro*_*roo 5

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)