[英]Using async/await to improve performance
我目前有一个服务方法,对传入的数据运行一组“规则”。 其中一些规则执行简单检查,如验证Id号,有些则转到数据库查找信息。 它看起来非常像这样:
public void RunRules(ValidationRequest request)
{
// Each rule returns bool for this example
var rules = GetRules();
var results = List<bool>();
Parallel.ForEach(rules, rule =>
{
var result = rule();
lock(results)
results.Add(result);
});
foreach(var result in results)
{
RecordResultInDatabase(result);
}
CallNextService(someNewRequest);
}
我认为(但不确定)我可以使用async/await
来改进。 我的想法是,当一个规则完成后,它可以调用RecordResultInDatabase
而其他规则仍在运行。
但是,作为一项要求,我不希望调用CallNextService
,直到所有规则都运行并将结果记录在数据库中。
问题是我是async/await
的绝对Task.WaitAll
,我认为(但不确定) Task.WaitAll
可能就是我正在寻找的东西。
我很不确定这是怎么做的,但我猜是这样的:
List<Task<bool>> ruleTasks = GetRules();
Task.WaitAll(ruleTasks);
// Somehow get the results of the rules and record them in the db???
我不认为async
- await
会提高您的性能。 简而言之, async
- await
在两种情况下很有用:
这些似乎都不是你的情况,因此没有理由在你的代码中使用async
- await
。
如果要在处理请求时调用RecordResultInDatabase()
,而不是在完成所有请求时,可以使用PLINQ而不是Parallel.ForEach()
。 另一个好处是,它还可以简化您的代码:
var results = GetRules().AsParallel().Select(rule => rule());
foreach (var result in results)
{
RecordResultInDatabase(result);
}
你不是在await / async之后:那些被设计为暂停GUI应用程序中的方法的执行,同时防止GUI冻结,并提高服务器场景中的可伸缩性,因为它有时可以避免使用“线程”进行“等待” ”。 由于您似乎没有等待异步操作,并且这不是GUI,因此这两者都不适用于您。
调用您的服务的客户端可能会使用await / async,但这是一个不同的问题。
你可以看到的是Task
(并行任务库)。 但是,只有当你的测试真正能够并行运行并且足够值得它 ! 对于微小,快速和简单的测试并行运行它们可能会损害性能,而不是改善。
最后,由于这在服务器上运行,因此您需要考虑并发活动:服务器是否仅为此请求提供服务? 除非这是真的,否则你根本不应该使用线程,保持单线程和干净。 由于所有CPU线程都会在处理其他并发请求时受到限制,因此运行多个Tasks或ParallelLoop 只会损害性能,而不仅仅是针对此请求,而是针对同时运行的每个其他请求。 那是因为没有“免费”核心可以接受你的线程但你确实要求它们。 没有额外的CPU容量可供使用。 你最终会在不获得任何好处的情况下进行上下文切换(并为此付出代价)。
一如既往:测试,测试,测试。
MSDN上的任务类: http : //msdn.microsoft.com/en-us/library/system.threading.tasks.task.aspx
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.