gpt4 book ai didi

c# - 等待/异步并跳出框框

转载 作者:太空狗 更新时间:2023-10-29 22:36:45 24 4
gpt4 key购买 nike

我有一个关于等待/异步和在与预期略有不同的场景中使用异步方法的问题,例如不直接等待它们。例如,假设我有两个需要并行完成的例程,它们都是异步方法(它们在内部等待)。我正在使用 await TAsk.WhenAll(...) ,它反过来期望等待某种任务列表。我所做的是这样的:

            await Task.WhenAll(new Task[]
{
Task.Run(async () => await internalLoadAllEmailTargets()),
Task.Run(async () => await internalEnumerateInvoices())
});

这对我来说似乎过于复杂,因为我正在创建异步任务,其唯一目的是调用另一个任务。我不能只使用从异步方法状态引擎返回的任务吗?然而,我没有这样做,因为编译器将每次直接提及的异步方法都视为调用点:

            // this doesn't seem to work ok
await Task.WhenAll(new Task[]
{
internalLoadAllEmailTargets(),
internalEnumerateInvoices()
});

这样的话,好像是一个接一个同步调用,如果我把await放在methods前面,就不是Task了。是否有关于如何在普通等待之外处理异步方法的规则手册?

最佳答案

每个 async 方法开始同步执行,但当它遇到第一个 await 时,它可能会异步执行。所以这一行:

await Task.WhenAll(internalLoadAllEmailTargetsAsync(), internalEnumerateInvoicesAsync());

应该工作得很好。它大致等同于:

var _1 = internalLoadAllEmailTargetsAsync();
var _2 = internalEnumerateInvoicesAsync();
await Task.WhenAll(_1, _2);

如果您的方法是真正异步的,那么这应该没问题。

现在,如果您的方法实际上在做一些同步工作——比如,大量 CPU 绑定(bind)代码——那么您可能想要使用 Task.Run 来调用它们(如果您的调用代码在界面线程)。

关于c# - 等待/异步并跳出框框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31659998/

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