C# 使用async和Wait的多个infinte循环

C# 使用async和Wait的多个infinte循环,c#,asynchronous,async-await,C#,Asynchronous,Async Await,我正在尝试生成不同的对象,并使用以下代码使用wait和async将每个对象插入其各自的列表中: static List<ClassA> classAList = new List<ClassA>(); static List<ClassB> classBList = new List<ClassB>(); public async void GenerateUsers() { await GenerateClassA(); awa

我正在尝试生成不同的对象,并使用以下代码使用wait和async将每个对象插入其各自的列表中:

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)
   }
}
程序不会退出GenerateClassA并生成。。。。。未打印到屏幕上


如何在无限循环中为每个无限循环使用wait和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返回类型阻止您观察任务,例如可能发生的异常。不建议这样做。但它与您最初发布的代码一致。

您使用的是wait GenerateClassA;,但是GenerateClassA不做任何与延续相关的事情——它只是运行到完成,并承诺返回一个任务。除了:它不能运行到完成,因为它是真实的。所以是的,这行不通


有些东西不是因为添加了异步而变为异步的。这使得真正的异步操作能够得到协调:不多不少。

如果没有第二个方法调用wait-GenerateClassB,它能工作吗?GenerateClassB或GenerateClassB中没有等待的内容,因此它们都是同步运行的。此外,如果希望它们同时运行,请使用wait Task.whallawait GenerateClassA,wait generateclassb发布的代码将不会编译。GenerateClassA显式返回一个任务,在这种情况下,在返回语句之前它不会返回到调用线程,或者GenerateClassA被标记为async,在这种情况下,编译器警告将确切地告诉您错误所在。无论哪种方式,它都是同步运行的。请您解释一下“不做任何与延续相关的事情”是什么意思;当你等待下一代的时候;,这可以做两件事中的一件:如果该方法返回一个已完成的任务,那么它将像普通代码一样继续执行;否则,wait下的代码被添加为任务报告完成时的延续回调;然而,在您的情况下,任务永远不会返回完成或其他,所以。。。等待甚至还没有到达;你的代码进入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)
   }
}