我已经尝试阅读异步方法,现在正尝试创建我自己的异步方法。该方法是一个返回错误日志列表的网络服务调用。我不确定我是否理解正确,所以我想我应该分享我的代码,看看我是否应该做一些不同的事情。
我想让代码做的就是通过调用 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;
}
谢谢!
最佳答案
我最近在 ThatConference 做了一次演讲在 async
on the server side ,我在幻灯片中解决了这个问题。
在服务器端,您希望避免使用 Task.Run
和其他将工作排队到线程池的结构。 尽可能保持线程池线程可用于处理请求。
因此,理想情况下,您的存储库应该有一个异步方法 GetAllErrorLogsAsync
,它本身就是异步的。如果 GetAllErrorLogs
不能异步,那么您也可以直接调用它(删除 await Task.Run
)。
Since it can take a second to fetch all the error logs I want to have the opportunity to do other stuff once I called the GetAllErrorLogs() method.
如果您有可用的 GetAllErrorLogsAsync
,则可以使用 Task.WhenAll
轻松完成此操作。但是,如果 GetAllErrorLogs
是同步的,那么您只能通过在您的请求中执行并行工作来做到这一点(例如,多次调用 Task.Run
,然后调用 Task。 WhenAll
).
必须小心翼翼地处理服务器上的并行代码。它仅在非常有限的一组场景中是可以接受的。服务器端 async
的全部要点是每个请求使用更少 线程,而当您开始并行化时,您正在做相反的事情:多个 em> 每个请求的线程数。这仅在您知道您的用户群非常小的情况下才适用;否则,您将扼杀服务器的可扩展性。
关于c# - 创建异步 Web 服务方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18367054/