【问题标题】:Async programming against non-async services针对非异步服务的异步编程
【发布时间】:2013-02-03 01:15:44
【问题描述】:

在过去的一年里,我们一直在开发一个新的网络应用程序,该应用程序调用了我们公司现有的服务层。

我们决定将所有面向服务的调用封装到我们自己的服务层(我将其称为 Web 服务层),以便我们使用哪些服务的详细信息(我们将移至未来某个时候的新 API)对 Web 层本身隐藏。

我们还决定,我们的大多数 Web 服务层方法都将返回 Task<T>。

就目前而言,我们调用的底层服务不是异步的,因此有人担心我们的 Web 服务层会最大化可用线程并在我们拥有大量用户时导致问题。

我正在寻找一种或另一种方式的信息,以进一步了解我们返回Task<T> 的决定将如何影响我们的网站,以及我们是否需要考虑更改我们的返回类型。

我们将在某个时候迁移到 VS2012,但现在我们使用的是 VS2010,而不是使用 async 和 await。

【问题讨论】:

    标签: c# asp.net asynchronous threadpool


    【解决方案1】:

    就目前而言,我们调用的底层服务不是异步的,并且 所以有人担心我们的网络服务层会最大化 当我们有大量的可用线程并导致问题 用户。

    是的,这是您应该关注的问题。我建议您仅在具有真正的异步方法时才这样做。但是,简单地将阻塞同步方法包装到异步 API 中会比直接从使用代码中调用同步方法更糟糕。在 ASP.NET 应用程序中,只有当底层 API 依赖于 I/O 完成端口时,您才能从异步调用中受益。否则只是浪费资源。

    您可以这样做的唯一有用的场景是您的方法可以并行调用而不是顺序调用。这是可能的,只是它们之间没有连接不同的方法。在这种情况下,您确实可以将同步方法包装在异步任务中。

    【讨论】:

    • 我们确实并行调用了所有的 Web 服务层方法(使用 Task.WaitAll)。
    • 好的,在这种情况下可能有理由这样做,正如我在回答中提到的那样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-28
    • 2018-03-08
    • 1970-01-01
    • 1970-01-01
    • 2011-09-24
    • 1970-01-01
    • 2017-08-16
    相关资源
    最近更新 更多