我是否需要在访问者模式中“等待”任务?
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);
放在某个地方,这将是最合适的,但根据您的实际代码,它可能不适合您。
例如,考虑:
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);
放在某个地方,这将是最合适的,但根据您的实际代码,它可能不适合您。