我们有一个 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/