【问题标题】:Tasks and Parallel Programming ASP.Net任务和并行编程 ASP.Net
【发布时间】:2012-01-26 10:03:34
【问题描述】:

是否可以在 .Net 中使用 TPL 库封装调用?

我想做这样的事情

Task t1 = Task.Factory.StartNew(() => { dynamic result = FacebookApp.Get("me/videos/uploaded", parameters); });

但是我得到一个 HttpContext 错误,我假设这是因为 FacebooApp.Get 方法在内部使用它。

如何将 FB API 调用封装到任务中以在服务器上并行运行?

我忘了提到我使用的是 Facebook C# SDK,因此是 FacebookApp.Get


已编辑

我一直在观看 TPL 库上的一些复数视频,并采用了下图中的模式。正如您所说,主线程来自创建控制器本身,但我仍然需要生成 4 个单独的网络任务来并行执行网络调用。我通过没有在第四个任务中调用的函数根本不依赖 HttpContext 来修复 HttpContext 错误。

对我来说,现在的最终结果是并行编程所承诺的更高性能的方法调用。

【问题讨论】:

  • 为什么要并行运行?
  • 嗨史蒂文,因为它正在拨打网络电话。我是 asp.net 4 中并行任务的新手,我正在将数据库、Web 服务、rest 等包装成一个任务模式,显然是为了减少服务器上的获取时间并希望提高性能。我不确定 fb C# SDK 是否有异步抽象?

标签: c# asp.net .net facebook task-parallel-library


【解决方案1】:

如果您调用 Web 服务,并且不想阻塞请求线程,最好使用asynchronous pages(Web 窗体)或asynchronous controllers(MVC)。如果您启动 Task 并需要从任务返回的值,您仍将等待该操作完成,这仍会阻塞请求线程。

请注意,由于默认情况下 ASP.NET 是多线程的,因此您不应在单个 Web 请求中启动多个线程。

更新:

请参阅此SO answer about multi-threading in web applications 了解更多信息。

【讨论】:

  • 我经常对人们犯这个错误的频率感到惊讶。
  • 好的,我刚刚测试了上图中的示例代码,现在页面加载速度快了很多。因此,网络调用是在并行欢呼声中完成的。
【解决方案2】:

您在上面屏幕截图中的实现将导致浪费 CPU 资源,特别是 ASP.NET 也使用的线程池线程,同时等待网络调用完成。如果您想最大化您的吞吐量,您必须使用不会导致阻塞 CPU 线程的异步 I/O 调用。为了充分受益,您还需要使用@Steven 提到的异步控制器。

但是,您不应该在 ASP.NET 请求实现中使用多个线程的建议并不是真正的好建议,因为它不像那样非黑即白。确实,ASP.NET 请求本身显然是在多个线程上执行的,因此从顶部开始已经有很好的并行度,但是如果您正在调用涉及 I/O 的其他层,您希望放弃 ASP .NET 线程,而这些 I/O 操作正在发生,以便 ASP.NET 可以在这些 I/O 操作挂起时处理更多请求。

与往常一样,这取决于实现的具体细节,但在您的情况下,由于您调用的是 Facebook 之类的东西,我可以告诉您,绝对会看到在这些设备上使用异步的好处来电。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多