问题描述
我是C#和.Net核心的初学者。因此,我对这个高级主题(任务并行库,PLINQ或并发集合)的了解非常有限。如果我的问题看起来很愚蠢,那我将非常抱歉。
我使用Asp.Net核心MVC和Razor页面开发了小型Web应用程序。我已经在这些Web应用程序中使用了异步并等待,但从未获得使用TPL或PLINQ或并发集合的机会。目前,我正在学习多线程,并且正在寻找机会在我的Web应用程序中实现TPL,PLINQ或并发集合。
这是我的查询,
- 使用Asp.Net核心MVC或Razor Pages构建的Web应用程序中是否使用了Task并行库,PLINQ或并发集合?
- 如果使用它,那么TPL,PLINQ比异步更适合那些情况?
- 是否有与此主题相关的教程?
[更新]
如果我在实用程序库或存储库服务中使用了PLINQ或TPL或并发集合,这对于我的Web应用程序来说将太多了,或者会在我的Web App [.net核心]中造成死锁或阻塞
还是让简单的事情变得非常复杂?
谢谢。
解决方法
使用Asp.Net核心MVC或Razor Pages构建的Web应用程序中是否使用了Task并行库,PLINQ或并发集合?
简短的答案是:否,PLINQ和多线程。
首先,异步/等待被包装在Task
类中,该类是TPL的一部分。
第二,在ASP.NET(核心)应用程序中执行并行操作并旋转多个工作线程被认为是不好的做法。
在ASP.NET Core中,您使用TPL和async
/ await
进行真正的异步操作(网络调用,I / O访问(文件访问),数据库调用等),而应用程序必须等待外部硬件组件完成。
ASP.NET Core应用程序中不等待CPU绑定的任务(计算等在一个或多个线程上运行),而只是在主线程上完成(以“阻塞”方式)。
ASP.NET(旧版)曾经拥有自己的线程池来管理连接,而ASP.NET Core仅为它使用默认线程池。在旧式ASP.NET中,即使您使用PLINQ触发多个任务并等待它们,每个请求仍将具有单线程执行。 ASP.NET Core不会。
仍然,剥离您自己的任务和线程是一个坏主意。当请求数少(延迟少)时,它可能使单线程操作更快,但由于线程匮乏,并且您的应用程序花费大量的CPU时间来管理线程和在线程之间切换,因此在高请求情况下它可能不负责任。它还会干扰线程启发式算法。
在线程匮乏的情况下,您的应用程序将不接受任何新请求。因此,CPU限制的任务应同步运行。仅通过Task.Run
运行CPU限制的工作不会给您带来任何好处。您可以在等待任务完成时释放请求线程,但是由于启动了一个新任务,因此将使用另一个线程来处理它。
类似于运行并行任务。当每个请求运行多个请求时,有一个问题是您必须将许多任务排入队列,并且要处理许多请求,并且应用程序停止接受请求,并且用户收到可怕的“ 50x” http错误,原因是您的应用程序不接受新请求而无法旋转最多的并行任务可以让您建立更多数量的连接,并在其他任务请求完成时将它们排队
并发和并行任务对于桌面应用程序很重要,并且在桌面应用程序中等待它们是有道理的(不要阻塞UI线程),即使它只是一个冗长的执行。另外,可以肯定的是,在桌面应用程序中,该应用程序仅由单个用户使用,因此,尽可能多地使用CPU内核来快速处理任务是一件好事。
当您将其应用于诸如ASP.NET Core应用程序之类的共享应用程序时,它并不能很好地转换。