Mar*_*tin 2 .net c# task-parallel-library async-await
我遇到了一个小问题,我编写了一个asp.net web api服务,我自动在控制器上添加了"async",当然这要求我使用await.
我遇到的问题是我的控制器连接到服务层,然后这个服务层连接到数据层 - 这个数据层是调用ASYNC版本的GET以对另一个REST服务进行异步调用的层 - 所以这很容易,我可以将我的数据层方法转换为具有"async"关键字,并且我将在HttpClient GetSync调用上进行等待.
但是我的服务层支持async/await我需要将返回类型更改为Task但是服务层实际上没有做任何ASYNC调用它实际调用HttpClient异步方法的数据层.
考虑到我有以下层结构,我有2个选项.
ASP.NET Web Api >>服务层>>数据层
只有在数据层中使用async和await才能完成它.
或者将async和await放在控制器和服务层的方法上,这需要重构,因为我需要返回Task.
我想我完全不了解它,从技术上讲,唯一的阻塞调用将在数据层中,所以要让所有线程返回线程池以供使用我应该只关心在数据层上放置async和await?
我什么时候需要在控制器上使用模式???
期待任何帮助
我在控制器上自动添加了"async",当然这要求我使用await.
那是倒退.async如果需要使用,只应添加方法await.
只有在数据层中使用async和await才能完成它.
您不应该在同步API中包装异步方法.这尤其是在服务器代码中真实的,因为你失去的所有好处async.
或者将async和await放在控制器和服务层的方法上,这需要重构,因为我需要返回Task.
这是正确的方法.请遵循以下准则:
async代码.例如,不要打电话Task.Wait或Task<T>.Result.我在博客中描述了这会导致死锁,但即使你破解它可靠地工作,你仍然会失去async服务器端的所有好处.async void.特别是在服务器端.Wait或Result使用await.这意味着等待方法必须是async Task或async Task<T>,这意味着调用等待方法的方法也必须等待.因此,您async将通过代码"增长".这是正常和正确的.您可能会发现我的关于异步编程最佳实践的文章很有帮助.