gpt4 book ai didi

c# - Async-await - 我做完了吗?

转载 作者:可可西里 更新时间:2023-11-01 09:02:58 24 4
gpt4 key购买 nike

最近,我对在 Web API 项目中实现异步等待模式的方式产生了怀疑。我读过 async-await 应该“一路”,这就是我所做的。但这一切都开始显得多余,我不确定我是否正确地做到了这一点。我有一个调用存储库的 Controller ,它调用数据访问( Entity Framework 6)类 - “一路异步”。我已经阅读了很多关于此的相互矛盾的内容,并希望将其清理干净。

编辑:引用的可能重复是一个很好的帖子,但不够具体满足我的需求。我包含了代码来说明问题。对此,似乎很难得到一个决定性的答案。如果我们可以将 async-await 放在一个地方,让 .net 处理其余的事情,那就太好了,但我们不能。所以,我是不是做得太过火了,还是没那么简单。

这是我所拥有的:

Controller :

public async Task<IHttpActionResult> GetMessages()
{
var result = await _messageRepository.GetMessagesAsync().ConfigureAwait(false);
return Ok(result);
}

存储库:
public async Task<List<string>> GetMessagesAsync()    
{
return await _referralMessageData.GetMessagesAsync().ConfigureAwait(false);
}

数据:
public async Task<List<string>> GetMessagesAsync()
{
return await _context.Messages.Select(i => i.Message).ToListAsync().ConfigureAwait(false);
}

最佳答案

public async Task<List<string>> GetMessagesAsync()    
{
return await _referralMessageData.GetMessagesAsync().ConfigureAwait(false);
}

public async Task<List<string>> GetMessagesAsync()
{
return await _context.Messages.Select(i => i.Message).ToListAsync().ConfigureAwait(false);
}

如果您对异步方法所做的唯一调用是尾调用,那么您真的不需要 await :
public Task<List<string>> GetMessagesAsync()    
{
return _referralMessageData.GetMessagesAsync();
}

public Task<List<string>> GetMessagesAsync()
{
return _context.Messages.Select(i => i.Message).ToListAsync();
}

你唯一丢失的是一些堆栈跟踪信息,但这很少有用。删除 await然后不是生成处理等待的状态机,而是将被调用方法产生的任务传递回调用方法,调用方法可以 await在那。

这些方法有时也可以现在内联,或者可能对它们进行尾调用优化。

如果这样做相对简单,我什至会将非基于任务的路径转换为基于任务的路径:
public async Task<List<string>> GetMeesagesAsync()
{
if(messageCache != null)
return messageCache;
return await _referralMessageData.GetMessagesAsync().ConfigureAwait(false);
}

变成:
public Task<List<string>> GetMeesagesAsync()
{
if(messageCache != null)
return Task.FromResult(messageCache);
return _referralMessageData.GetMessagesAsync();
}

但是,如果在任何时候您需要任务的结果来做进一步的工作,那么 await ing 是要走的路。

关于c# - Async-await - 我做完了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31390655/

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