我是否需要在访问者模式中“等待”任务?

Do I ever need to `await` tasks for in a visitor pattern?

例如,考虑:

public class Student
{
    public async Task Run()
    {
        var rand = new Random();
        while (true)
        {

            await ReadBook();
            await Task.Delay(rand.Next(4000));
        }
    }

    public async Task ReadBook()
    {
        // ...
    }
}

class Main
{
    async Task Run()
    {
        var s1 = new Student();
        var s2 = new Student();

        s1.Run();
        s2.Run();

        while (true)
        {
            Console.WriteLine("Books read: {0}", GetReadBooks());
            await Task.Delay(10000);
        }
    }

    int GetReadBooks()
    {
        return 1;
    }
}

我是否需要等待 Student.Run(),甚至维护对返回任务的引用?如果我想取消任务,我理解这种需要;我怀疑我还需要 await 以接收 Student.Run() 抛出的任何异常,但除此之外,我是否关心这些任务?

两个学生可以同时看书吗?

省略 await 意味着 s2.Run()s1.Run() 进行时启动。在这种情况下,你想要s1.Run()s2.Run()同时运行,所以你绝对不应该简单地写await s1.Run();。因为你的循环是永无止境的,等待它们除了异常之外没有太多意义,但如果你的循环在你的真实代码中真的永无止境,我会感到惊讶。 Task 旨在表示在某个时刻完成的事情。如果你能知道什么时候完成,那么你就可以据此确定 await 任务的合适位置。

我可能会猜测将任务保存在变量中,然后将 await Task.WhenAll(run1, run2); 放在某个地方,这将是最合适的,但根据您的实际代码,它可能不适合您。