我正在尝试生成不同的对象,并使用以下代码使用await和async将每个对象插入其各自的List
中:
static List<ClassA> classAList = new List<ClassA>();
static List<ClassB> classBList = new List<ClassB>();
public async void GenerateUsers()
{
await GenerateClassA();
await GenerateClassB();
}
private static Task GenerateClassA()
{
while(true)
{
Thread.Sleep(3000);
classAList .Add(new ClassA());
Console.WriteLine(classAList.Count);
}
}
private static Task GenerateClassB()
{
while (true)
{
Thread.Sleep(6000);
classBList .Add(new ClassB());
Console.WriteLine(classBList.Count)
}
}
当我打电话给GenerateUsers
时
UserContainer uc = new UserContainer(); //Class GenerateUsers is defined
uc.GenerateUsers();
Console.WriteLine("Generating.....");
程序未退出GenerateClassA
,Generating.....
未打印到屏幕上。
如何使用await
和async
为每个无限循环在无限循环中生成不同的对象。
答案 0 :(得分:4)
您使用的是await GenerateClassA();
,但是GenerateClassA
没有执行任何与延续相关的内容 - 它只是运行完成承诺返回{ {1}}。除了:它无法运行完成,因为Task
。所以,是的,这不起作用。
由于您添加了while(true)
,因此 异步。 使真正的异步操作得以协调:仅此而已。
答案 1 :(得分:3)
您调用的方法不是async
,因此它们会同步执行。实际上,只有第一种方法GenerateClassA()
甚至被称为。该方法永远不会返回,所以你永远不会调用第二个方法。可能你想要更像这样的东西:
public void GenerateUsers()
{
GenerateClassA();
GenerateClassB();
}
private static async void GenerateClassA()
{
while(true)
{
await Task.Delay(3000);
classAList.Add(new ClassA());
Console.WriteLine(classAList.Count);
}
}
private static async void GenerateClassB()
{
while (true)
{
await Task.Delay(6000);
classBList.Add(new ClassB());
Console.WriteLine(classBList.Count)
}
}
请注意,void
返回类型会阻止您观察任务,例如可能发生的异常。不建议这样做。但它与您最初发布的代码一致。