gpt4 book ai didi

c# - C# 中的异步等待和任务

转载 作者:行者123 更新时间:2023-11-30 15:23:50 25 4
gpt4 key购买 nike

我正在测试async await and task 功能,但我似乎遗漏了什么

当我这样写的时候一个存在的起点

void A()
{
Debug.WriteLine("pre B");
B();
Debug.WriteLine("post B");
}

async void B()
{
Debug.WriteLine("pre C");
await C();
Debug.WriteLine("post C")
}

async Task C()
{
await Task.Yield();
Debug.WriteLine("pre D");
await D();
Debug.WriteLine("post D");
}

async Task D()
{
Debug.WriteLine("inside D");
}

我在调试控制台中得到的输出为

pre B,
pre C,
pre D,
inside D,
post D,
post C,
post B

它是异步运行的吗??我猜不是,以为它应该运行成什么样

pre B,
pre C,
post B,
post C,
pre D,
inside D,
post D

那么这里有什么问题呢?

最佳答案

我建议您阅读我的 async intro并跟进我的 async best practices article .特别是,最佳做法之一是仅对事件处理程序使用 async void

async 的全部要点是启用异步代码同时保持该代码以与同步代码类似的方式编写。因此,如果外部方法等待从内部方法返回的任务,则外部方法将不会继续执行,直到内部方法完成。

因此,例如,同步代码可能如下所示:

void A()
{
Debug.WriteLine("pre B");
B();
Debug.WriteLine("post B");
}

void B()
{
Debug.WriteLine("inside B");
Thread.Sleep(1000);
Debug.WriteLine("still inside B");
}

相应的异步代码为:

async Task A()
{
Debug.WriteLine("pre B");
await B();
Debug.WriteLine("post B");
}

async Task B()
{
Debug.WriteLine("inside B");
await Task.Delay(1000);
Debug.WriteLine("still inside B");
}

尽管代码现在将异步执行,但输出与同步版本完全相同。

如果您希望一个方法启动并发操作并然后继续,您可以只调用这些方法,然后稍后执行await:

async Task A()
{
// Start both tasks
Debug.WriteLine("pre B1");
Task b1 = B();
Debug.WriteLine("post B1, pre B2");
Task b2 = B();
Debug.WriteLine("post B2, pre await");

// (asynchronously) wait for them to complete
await Task.WhenAll(b1, b2);
Debug.WriteLine("post await");
}

async Task B()
{
Debug.WriteLine("inside B");
await Task.Delay(1000);
Debug.WriteLine("still inside B");
}

在这种情况下,您会看到 B 的两个执行都开始,并且 A 将在两个 B 完成后继续执行。

关于c# - C# 中的异步等待和任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33822387/

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