繁体   English   中英

使用async / await来提高性能

[英]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在两种情况下很有用:

  1. 提高GUI应用程序的响应能力。
  2. 提高服务器应用程序的可伸缩性。

这些似乎都不是你的情况,因此没有理由在你的代码中使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM