c# - 在任务中进行异步/等待数据库调用?

标签 c# wcf asynchronous task-parallel-library async-await

我们有一个 WCF 服务以下列方式处理传入的消息:

public bool ProcessMessage(string message)
{
    var returnValue = GetReturnValue();

    Task.Run(() => {
        //do some things with the message
        UpdateDatabase();
        SendRepliesOverNetwork();
    });

    return returnValue;
}

为了处理尽可能多的消息,我们在此处添加了任务。我们希望尽快将 returnValue 返回给调用者,让 Task 完成它的工作。

我的问题:使用可等待的异步数据库调用和/或使用异步方法通过网络回复是否有任何优势?

我很谨慎,因为我认为这可能会造成过多的上下文切换。我们已经看到该应用在负载下使用 100 多个线程。

最佳答案

首先,我建议您退后一步,真正地问问早点回来是否是个好主意。你所做的通常是危险的;在进行实际处理之前,您要将“OK”返回给客户。如果您的客户知道“returnValue”并不意味着操作已完成并且只有在收到“SendReplies”时才认为操作已完成,这才是一个好主意。

就是说,是的,您应该会看到使一切都尽可能异步的好处。如果您的所有任务都是非阻塞的,您将更好地利用线程池(更少的上下文切换)。

public bool ProcessMessage(string message)
{
  var returnValue = GetReturnValue();

  Task.Run(async () => {
    //do some things with the message
    await UpdateDatabaseAsync();
    await SendRepliesOverNetworkAsync();
  });

  return returnValue;
}

关于c# - 在任务中进行异步/等待数据库调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15769189/

相关文章:

c# - 重载与泛型参数

c# - 在 Dynamics 365 API 上运行查询

c# - 如何处理 WCF 异常(带代码的综合列表)

c# - 使用调用另一个任务方法的异步任务方法 - 可以仅使用一个任务吗?

c# - 从 html 创建 pdf 时,如何隐藏具有特定类的图像?

c# - 弥补 SOA 中继承不足的模式

c# - 使用 svcutil 为 3 个服务生成服务客户端

node.js - Mongoose insertMany().exec() 返回 TypeError

java - Spring Boot 2异步进行调用但不返回响应

javascript - Node JS 中的事件循环阻塞和异步编程