And*_*eas 9 .net c# async-await
我试图阅读异步方法,现在我正在尝试创建自己的异步方法.该方法是一个webservice调用,它返回错误日志列表.我不确定我是否理解正确,所以我想我会分享我的代码,看看我是否应该做任何不同的事情.
我想要的代码就是通过调用方法GetAllErrorLogs()来返回错误日志列表,这是一个同步方法.因为我需要一秒钟才能获取所有错误日志,所以当我调用GetAllErrorLogs()方法时,我希望有机会做其他事情.这是代码.
[WebMethod]
public async Task<List<ErrorLog>> GetAllErrorLogs()
{
List<ErrorLog> errorLogs = new List<ErrorLog>();
await System.Threading.Tasks.Task.Run(() => {
errorLogs = ErrorLogRepository.GetAllErrorLogs();
});
if (errorLogs == null)
return new List<ErrorLog>();
return errorLogs;
}
Run Code Online (Sandbox Code Playgroud)
谢谢!
我最近在服务器端的ThatConference上发表了演讲,我在幻灯片中解决了这个问题.async
在服务器端,您希望避免使用Task.Run队列工作到线程池的其他构造.尽可能保持线程池线程可用于处理请求.
因此,理想情况下,您的存储库将具有异步方法GetAllErrorLogsAsync,该方法本身是异步的.如果GetAllErrorLogs不能异步,那么你也可以直接调用它(删除await Task.Run).
因为我需要一秒钟才能获取所有错误日志,所以当我调用GetAllErrorLogs()方法时,我希望有机会做其他事情.
如果您有GetAllErrorLogsAsync可用的,那么可以使用它轻松完成Task.WhenAll.但是,如果GetAllErrorLogs是同步的,那么您只能通过在请求中执行并行工作来执行此操作(例如,多次调用Task.Run后跟Task.WhenAll).
必须非常谨慎地处理服务器上的并行代码.它只能在非常有限的场景中接受.async服务器端的整个要点是每个请求使用更少的线程,当你开始并行化时,你正在做相反的事情:每个请求有多个线程.这只适用于您知道您的用户群非常小的情况; 否则,你将扼杀你的服务器可扩展性.
| 归档时间: |
|
| 查看次数: |
20281 次 |
| 最近记录: |