试图理解新的异步/等待模式,我有一个问题,我找不到答案,即如果我应该用异步装饰我的方法,如果我打算从其他异步函数调用这些方法,或只是返回Tasks在适当情况下?
换句话说,这些A,B或C类中哪一个最好,为什么?
class A<T>
{
public async Task<T> foo1() //Should be consumed
{
return await foo2();
}
public async Task<T> foo2() //Could be consumed
{
return await foo3();
}
private async Task<T> foo3() //Private
{
return await Task.Run(...);
}
}
class B<T>
{
public async Task<T> foo1() //Should be consumed
{
return await foo2();
}
public async Task<T> foo2() //Could be consumed
{
return await foo3();
}
private Task<T> foo3() //Private
{
return Task.Run(...);
}
}
class C<T> …Run Code Online (Sandbox Code Playgroud) 最近我对我在Web API项目中实现async-await模式的方式产生了怀疑.我已经读过async-await应该是"一直",这就是我所做的.但这一切都开始显得多余,我不确定我是否正确地做到了这一点.我有一个调用存储库的控制器,它调用数据访问(实体框架6)类 - "一直异步".我已经阅读了很多相互矛盾的内容,并希望将其清理干净.
编辑:引用的可能重复是一个很好的帖子,但不够具体到我的需要.我提供了代码来说明问题.看来真的很难得到一个决定性的答案.如果我们可以将async-await放在一个地方然后让.net处理其余部分,那就太好了,但我们做不到.那么,我是在做它还是不那么简单.
这是我得到的:
控制器:
public async Task<IHttpActionResult> GetMessages()
{
var result = await _messageRepository.GetMessagesAsync().ConfigureAwait(false);
return Ok(result);
}
Run Code Online (Sandbox Code Playgroud)
库:
public async Task<List<string>> GetMessagesAsync()
{
return await _referralMessageData.GetMessagesAsync().ConfigureAwait(false);
}
Run Code Online (Sandbox Code Playgroud)
数据:
public async Task<List<string>> GetMessagesAsync()
{
return await _context.Messages.Select(i => i.Message).ToListAsync().ConfigureAwait(false);
}
Run Code Online (Sandbox Code Playgroud) 最好的做法是收集async循环内集合中的所有调用并执行Task.WhenAll().但是,想要了解await在循环中遇到的情况会发生什么,返回Task包含什么?那些进一步的async电话呢?它会创建新任务并将它们添加到已经返回的Task顺序中吗?
根据下面的代码
private void CallLoopAsync()
{
var loopReturnedTask = LoopAsync();
}
private async Task LoopAsync()
{
int count = 0;
while(count < 5)
{
await SomeNetworkCallAsync();
count++;
}
}
Run Code Online (Sandbox Code Playgroud)
我假设的步骤是
LoopAsync 被叫count 设置为零,代码进入while循环,条件被检查SomeNetworkCallAsync 被调用,等待返回的任务CallLoopAsync()现在,如果有足够的时间让流程生存,那么下一个代码行将如何/以何种方式执行count++并进一步SomeNetworkCallAsync执行?
更新 - 基于Jon Hanna和Stephen Cleary:
因此,有一个任务,该任务的实现将涉及5次对NetworkCallAsync的调用,但使用状态机意味着这些任务不需要明确地链接以使其工作.例如,这允许它根据任务的结果决定是否中断循环,等等.
虽然它们没有链接,但每次调用都会等待前一个调用完成,因为我们已经使用了await(在状态m/c中awaiter.GetResult();).它的行为就好像连续五年已吁请他们执行一前一后另一个(仅后,以前的呼叫被完成).如果这是真的,我们必须更加小心我们如何组成异步调用.对于ex:
而不是写作
private async Task …Run Code Online (Sandbox Code Playgroud)