使用async和await的多个infinte循环

时间:2017-03-19 22:08:37

标签: c# asynchronous async-await

我正在尝试生成不同的对象,并使用以下代码使用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.....");

程序未退出GenerateClassAGenerating.....未打印到屏幕上。

如何使用awaitasync为每个无限循环在无限循环中生成不同的对象。

2 个答案:

答案 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返回类型会阻止您观察任务,例如可能发生的异常。不建议这样做。但它与您最初发布的代码一致。