【问题标题】:How to reduce the execution time in C# while calling an API?如何在调用 API 时减少 C# 中的执行时间?
【发布时间】:2014-09-04 12:13:54
【问题描述】:

我正在创建一个 Windows 应用程序(使用 Windows 窗体应用程序),它调用 Web 服务来获取数据。在数据中,我必须获取 200 多个客户信息,并且对于每个客户,我必须获取所有用户信息。一个客户端可以有 50 到 100 个用户。因此,我在循环中调用 Web 服务(在获取所有客户端列表之后),以便每个客户端获取用户列表。这是一个漫长的过程。我想减少整个过程的执行时间。所以,请建议我哪种方法可以帮助减少执行时间,目前一次数据提取最多需要 40-50 分钟。让我知道任何解决方案,如多线程或其他任何东西,以最适合我的应用程序为准。

提前致谢。

【问题讨论】:

    标签: c# .net web-services desktop-application windows-applications


    【解决方案1】:

    如果您可以控制 Web 服务,请使用一种方法一次返回所有客户端,而不是像 Michael 建议的那样逐个返回,以避免往返。

    如果不是,请确保同时(而不是按顺序)发出尽可能多的请求,以避免尽可能多的延迟。对于每个请求,您将至少有 1 次往返(因此至少您的 ping 延迟值得),如果您发出 150 个请求,那么您将获得对服务器的 ping X 150 值得“只是在网络上等待”。如果您将这些请求分成 4 束,并并行执行这些请求中的每一个,那么您将只等待 150/4*ping 时间。因此,您同时执行的请求越多,等待的时间就越短。

    【讨论】:

    • 您好罗南,感谢您的回复。所以,我必须实现多线程,并且必须为每 4 个客户端启动一个新线程来获取用户的数据。对吗?
    • @atul 不,启动线程非常慢,您需要阅读多线程,这是一个复杂的主题方式,以适应 stackoverflow 的答案,拿起一本书。但它的要点是您需要预先分配足够的线程(通常围绕虚拟内核的数量,包括 HT,X2 是许多工作负载的一个很好的权衡)并保持尽可能多的线程处于使用状态(因此每个请求都被分配到第一个未使用的线程)。
    • @atul 另请注意,如果不清楚,如果您可以获得第一个选项(让 Web 服务立即提供完整列表),它总是会更快。所以我会先走这条路(即使我无法控制服务,我也会要求对提供服务的人进行更改,他们很可能会很乐意遵守,因为否则你会敲打他们的服务器有数百个请求,而不是一个!)
    • @@ronan 谢谢。我将更多地研究您建议的有关多线程的内容。因为我无法控制 Web 服务,因为这些是我为我的应用程序使用的第三方 Web 服务。不过,如果他们可以在一次 Web 服务调用中为我提供所有数据,我会请求他们的支持。
    【解决方案2】:

    我建议您避免为每个用户循环调用服务以获取详细信息,而是在服务器中执行该循环并一次性返回所有数据,否则您将遭受很多无用的延迟由数千次调用引起,而不仅仅是因为服务器时间或数据传输时间。

    这也是一种模式,称为 Remote FacadeFacade Pattern,由 Martin Fowler 和四人帮解释:

    任何打算用作远程对象的对象都需要一个粗粒度接口,以最大限度地减少完成某事所需的调用次数 [...] 而不是单独要求订单及其订单行,您需要在一次调用中访问和更新订单和订单行。

    【讨论】:

    • 嗨迈克尔,感谢您的回复。我无法控制 Web 服务,因此无法在 Web 服务中进行更改。因此,它不适用于这种情况。
    【解决方案3】:

    如果您无法控制 Web 服务,您可以尝试使用 Parallel.ForEach 循环而不是 ForEach 循环来查询 Web 服务。

    MSDN 上有使用教程:http://msdn.microsoft.com/en-us/library/dd460720(v=vs.110).aspx

    【讨论】:

    • 您好纪尧姆,感谢您的回复。我会检查并实施。
    • @atul 好。如果这能解决您的问题,请告诉我。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-31
    • 2017-03-03
    • 1970-01-01
    • 1970-01-01
    • 2016-01-29
    相关资源
    最近更新 更多