gpt4 book ai didi

c# - 异步方法中的最后一次异步调用是否需要等待?

转载 作者:太空狗 更新时间:2023-10-29 22:59:37 25 4
gpt4 key购买 nike

当异步方法调用是我的异步方法中的最后一次调用时,我无法理解是否需要 await 语句。例如

public async Task CallAsync(byte[] data)
{
await Call1Async(data);
Call2Async(data);
}

public async Task Call1Async(byte[] data)
{
...
}

public async Task Call2Async(byte[] data)
{
...
}

上面的代码可以编译,但会出现警告“考虑将 await 应用于此方法”。但我认为在方法中最后一次调用时申请等待会浪费资源。

同时,如果我使用return Call2Async(data);而不仅仅是 Call2Async(data); ,警告就会消失。这表示 await在这种情况下实际上不需要。

但这只适用于有返回值的方法(即 Task<T> 而不仅仅是 Task )。对于没有返回值的方法,我需要这个。有什么方法可以对返回值的方法做同样的事情吗?

即我需要以某种方式返回 Task Call2Async 返回的对象给 CallAsync 的来电者而且我不能使用 return CallAsync 中的声明明确地因为我的方法没有返回值。当然,我可以将它们全部调整为返回值(例如 true),但这不是一个优雅的解决方案。

附言如果我的方法中只有一个异步调用,我只是不在方法签名中添加“异步”,它就可以工作(不需要“return”语句)。但是,如果该方法包含多个异步调用,我需要具有“异步”修饰符才能等待第一个调用“await Call1Async(data)”。并且添加“异步”修饰符会使编译器需要“返回”以将任务对象返回给调用者(这仅适用于具有返回值的方法)。这就是我要克服的问题。

最佳答案

在下面的方法中:

public async Task CallAsync(byte[] data)
{
await Call1Async(data);
Call2Async(data);
}

方法的控制在开始 Call2Async 后返回。也就是说,如果您要 await CallAsync(data),它将在 Call2Async 结束之前完成。这可能不是您想要的。此方法只有在两个调用都完成后才会结束:

public async Task CallAsync(byte[] data)
{
await Call1Async(data);
await Call2Async(data);
}

您可以看到这些示例输出中的差异(我实现了两个异步调用来简单地打印开始、延迟一秒钟,然后打印结束)。

void Main()
{
Console.WriteLine("Main start");
CallAsync(null).Wait();
Console.WriteLine("Main end");
}

没有第二个 await 的方法打印:

Main start
Call1Async start
Call1Async end
Call2Async start
Main end
Call2Async end

第二个await:

Main start
Call1Async start
Call1Async end
Call2Async start
Call2Async end
Main end

这个实现也有一个问题:

public Task CallAsync(byte[] data)
{
Call1Async(data);
return Call2Async(data);
}

它同时启动两个异步调用,然后在 Call2Async 完成时返回控制权,无论 Call1Async 是否完成。同样,这可能不是您想要的。

关于c# - 异步方法中的最后一次异步调用是否需要等待?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20287429/

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