gpt4 book ai didi

C# 异步并等待不等待代码完成

转载 作者:行者123 更新时间:2023-11-30 13:19:00 28 4
gpt4 key购买 nike

为什么下面的 asyncawait 不起作用?我正在尝试了解这一点,想了解我的代码有什么问题。

class Program
{
static void Main(string[] args)
{

callCount();

}

static void count()
{
for (int i = 0; i < 5; i++)
{
System.Threading.Thread.Sleep(2000);
Console.WriteLine("count loop: " + i);
}
}

static async void callCount()
{
Task task = new Task(count);
task.Start();
for (int i = 0; i < 3; i++)
{
System.Threading.Thread.Sleep(4000);
Console.WriteLine("Writing from callCount loop: " + i);
}
Console.WriteLine("just before await");
await task;
Console.WriteLine("callCount completed");
}
}

程序开始 count() 方法,但没有完成就退出了。随着等待任务;我期望它在退出之前等待完成 count() 方法的所有循环(0、1、2、3、4)。我只得到“计数循环:0”。但它正在经历所有 callCount()。它就像等待任务什么也没做。我希望 count() 和 callCount() 异步运行并在完成时返回 main。

最佳答案

当你执行一个async方法时,它开始同步运行直到它到达一个await语句,然后其余代码异步执行,执行返回给调用者.

在你的代码中,callCount() 开始同步运行到 await task,然后返回到 Main() 方法,因为你不是等待方法完成,程序结束,没有方法 count() 可以完成。

您可以通过将返回类型更改为 Task 并在 Main() 方法中调用 Wait() 来查看所需的行为。

static void Main(string[] args)
{
callCount().Wait();
}

static void count()
{
for (int i = 0; i < 5; i++)
{
System.Threading.Thread.Sleep(2000);
Console.WriteLine("count loop: " + i);
}
}

static async Task callCount()
{
Task task = new Task(count);
task.Start();
for (int i = 0; i < 3; i++)
{
System.Threading.Thread.Sleep(1000);
Console.WriteLine("Writing from callCount loop: " + i);
}
Console.WriteLine("just before await");
await task;
Console.WriteLine("callCount completed");
}

编辑:这是您的代码的执行方式:

(为了更好地理解,让我们将 CallCount() 返回类型更改为 Task)

  1. 程序以 Main() 方法开始。
  2. CallCount() 方法被调用。
  3. 任务已创建,所有这些都在同一个线程中。
  4. 然后任务开始。此时,将创建一个新线程,并行运行 Count() 方法。
  5. 在 CallCount() 中继续执行,执行 for 循环并打印“just before await”。
  6. 然后到达await task;。这就是异步等待模式发挥作用的时候。 await不像Wait(),它不会阻塞当前线程直到任务完成,而是将执行控制权返回给Main() 方法和 CallCount() 中的所有剩余指令(在本例中只是 Console.WriteLine("callCount completed");)将在任务完成后执行。
  7. Main() 中,对 CallCount() 的调用返回一个 Task(以及 CallCount() 的剩余指令 和原始任务)并继续执行。
  8. 如果您不等待此任务完成,Main() 中的执行将继续完成程序并销毁任务。
  9. 如果您调用 Wait()(如果 CallCount() 为空,则您没有要等待的任务)您让任务完成,保持 Main() 用于执行 Count() 并打印“callCount completed”。

如果您想在 CallCount() 中等待计数任务完成而不返回到 Main() 方法,请调用 task.Wait();,所有的程序都会等待Count(),但这不是await会做的。

link详细解释异步等待模式。

希望您的代码工作流程图对您有所帮助。

enter image description here

关于C# 异步并等待不等待代码完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35280808/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com