我不明白当异步方法调用是我的异步方法中的最后一个调用时是否需要await语句。例如
public async Task CallAsync(byte[] data)
{
await Call1Async(data);
Call2Async(data);
}
public async Task Call1Async(byte[] data)
{
...
}
public async Task Call2Async(byte[] data)
{
...
}
上面的代码可以编译,但带有警告“请考虑将等待方式应用于此方法”。但是我认为,等待该方法中的最后一次调用会浪费资源。
同时,如果我使用return Call2Async(data);
而不是just Call2Async(data);
,警告将消失。这表明await
在这种情况下实际上不是必需的。
但这仅适用于具有返回值的方法(即Task<T>
,不只是Task
)。对于没有返回值的方法,我需要此方法。有什么方法可以做同样的价值回报方法?
即我需要以某种方式将返回的Task
对象返回Call2Async
给调用方,CallAsync
并且由于我的方法没有返回值,因此我不能显式地使用return
语句CallAsync
。当然,我可以将它们全部调整为返回值(例如true),但这不是一个很好的解决方案。
PS:如果我的方法中只有异步调用,则只需在方法签名中不添加“ async”即可,并且它可以工作(不需要“ return”语句)。但是,如果该方法包含多个异步调用,则我需要具有“异步”修饰符,以便能够等待第一个调用“ await Call1Async(data)”。并且添加'async'修饰符使编译器需要'return'才能将Task对象返回给调用者(这仅适用于具有返回值的方法)。这就是我要克服的问题。
在以下方法中:
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
完成。同样,这可能不是您想要的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句