繁体   English   中英

任务和并行编程 ASP.Net

[英]Tasks and Parallel Programming ASP.Net

是否可以使用 .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 个单独的网络任务来并行执行网络调用。 我通过没有在第 4 个任务中调用的函数完全不依赖 HttpContext 来修复 HttpContext 错误。

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

如果您调用 Web 服务,并且不想阻塞请求线程,最好使用异步页面(Web Forms) 或异步控制器(MVC)。 如果您启动一个Task并需要从该任务返回的值,您仍将等待该操作完成,这仍会阻塞请求线程。

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

更新:

有关更多信息,请参阅有关 Web 应用程序中的多线程的 SO 答案

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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