我是否需要以访客模式“等待”任务?

时间:2016-09-26 08:05:56

标签: c# asynchronous visitor

例如,考虑:

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(),或者甚至维持对返回任务的引用?我理解是否有必要取消任务;我怀疑我还需要等待,以便接收Student.Run()引发的任何异常,但除此之外,我是否关心这些任务?

1 个答案:

答案 0 :(得分:0)

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

await正在进行时,离开s2.Run()意味着s1.Run()开始。在这种情况下,您希望 s1.Run()s2.Run()同时运行,因此您绝对不应该简单地编写await s1.Run();。由于你的循环是永无止境的,等待它们除了异常之外并没有多大意义,但如果你的循环在你的真实代码中真的永无止境,我会感到惊讶。 Task旨在表示在某些时候完成的内容。如果你能告诉它何时完成,那么你可以根据await任务的适当位置确定。

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