我无法理解当异步方法调用是我的异步方法中的最后一个调用时是否需要等待语句。例如。
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
)。我需要这个用于没有返回值的方法。有没有办法对返回值的方法做同样的事情?
IE。我需要以某种方式返回Task
返回的对象Call2Async
给来电者CallAsync
我不能使用return
中的声明CallAsync
明确地,因为我的方法没有返回值。当然,我可以将它们全部调整为返回值(例如 true),但这不是一个优雅的解决方案。
附:如果我的方法中有唯一的异步调用,我只需不在方法签名中添加“异步”,它就可以工作(不需要“返回”语句)。但是,如果该方法包含多个异步调用,我需要具有“async”修饰符才能等待第一个调用“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
prints:
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
是否完整。再说一遍,这可能不是您想要的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)