c# - 创建异步 Web 服务方法

标签 c# .net async-await

我已经尝试阅读异步方法,现在正尝试创建我自己的异步方法。该方法是一个返回错误日志列表的网络服务调用。我不确定我是否理解正确,所以我想我应该分享我的代码,看看我是否应该做一些不同的事情。

我想让代码做的就是通过调用 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/

相关文章:

c# - 是否有执行 .SelectMany(x => x) 的 Linq 方法?

c# - 在 C# 中存储 SQL 结果

javascript - 使用异步过滤和映射 Promise

javascript - 需要在http响应后运行该变量

javascript - 图片加载异步等待

c# - IIS 7.5 405 不允许从 StaticFileModule 进行 PUT 方法

c# - 创建一个 c# 函数来比较 int 结果

c# - 构造函数是否可以包含确定调用哪个其他构造函数覆盖的逻辑?

.net - DataContractSerializer 与 XmlSerializer : Pros and Cons of each serializer

c# - 在处理 SqlConnection、SqlDataReader、SqlCommand 时要捕获哪些异常?