最近,发布了关于Winforms应用程序线程的书(由Joe Duffy在Windows上进行并发编程)。本书专注于winforms,共1000页。
ASP.NET线程有什么问题?我确信在ASP.NET中实现线程时需要注意很多问题。我应该注意什么?
由于
答案 0 :(得分:4)
由于IIS收到的每个http请求都是单独处理的,无论如何都要在它自己的线程上进行处理,唯一的问题就是如果你从单个http请求的范围内启动一些长时间运行的进程。在这种情况下,我会将这些代码放入一个单独的引用依赖程序集中,编码为中间层组件,根本不依赖或耦合到ASP.Net模型,并分别处理该程序集中出现的任何并发问题,担心ASP.Net模式......
答案 1 :(得分:3)
在各种活动中在线查看他的演讲。
答案 2 :(得分:2)
通常鼓励您使用.Net中的线程池,因为它具有代表您管理事物的诸多好处.....但ASP.net中 NOT 。
由于ASP.net已经是多线程的,它使用线程池来处理映射到ASP.net ISAPI过滤器的请求,并且因为线程池的大小是固定的,所以通过使用它你基本上都是线程留出来做处理请求的工作。
在小型,低流量的网站中,这不是问题,但在较大的高流量网站中,您最终会竞争并消耗ASP.net流程所依赖的线程。
如果您想使用线程,可以执行类似....
的操作 Thread thread = new Thread(threadStarter);
thread.IsBackground = true;
thread.Start();
但有警告:请确保IsBackground
设置为true
,因为如果不存在,则前台中的线程可能会阻止IIS回收或重新启动工作流程。
答案 3 :(得分:1)
最让人想到的是,为什么要在ASP.NET中“实现线程化”。
您需要始终注意ASP.NET 多线程,因为许多请求可以在其自己的线程中进行模拟处理。因此,例如,使用静态字段需要考虑线程。
然而,您很少想要自己在代码中启动新线程。
就UI中线程的常见winforms问题而言,ASP.NET中不存在这些问题。没有基于窗口的消息泵担心。
答案 4 :(得分:1)
可以在ASP.NET中创建异步页面。这些将执行到某一点的所有步骤。例如,这些步骤将包括异步提取数据。完成所有异步任务后,将执行页面生命周期的其余部分。与此同时,工作线程没有等待数据库I / O完成。
在此模型中,所有额外线程都在执行,而请求,页面实例和所有控件仍然存在。在启动自己的线程时必须要小心,在线程执行时,请求,页面实例和控件可能已被Disposed。
此外,像往常一样,确保多个线程实际上会提高性能。通常,额外的线程会使事情变得更糟。
答案 5 :(得分:1)
首先,您在谈论异步ASP.NET吗?或者使用ThreadPool /旋转你自己的线程?
如果你不谈论异步ASP.NET,那么要回答的主要问题是:你将在其他线程中做些什么工作?工作是否特定于请求/响应循环,还是更多关于在后台处理全局任务?
修改强>
如果您需要为给定的请求/响应周期处理并发操作(比多线程 IMO更好的术语),则使用ASP的异步功能。净。这些提供了对IIS对并发性的支持的抽象,允许服务器在当前请求等待工作完成时处理其他请求。
对于全局任务的后台处理,我根本不会使用ASP.NET。您应该假设IIS将在随机时间点回收您的AppPool。您也不应该假设IIS将以任何类型的计划运行您的AppPool。任何重要的后台处理都应该在IIS之外完成,可以是计划任务,也可以是Windows服务。我通常采用的方法是拥有Windows服务和共享工作队列,网站可以在其中发布工作项。队列可以是数据库表,可靠的基于消息的队列(MSMQ等),文件系统上的文件等。
答案 6 :(得分:1)
陷阱与任何多线程应用程序几乎相同。
处理请求所涉及的类(Page,Controls,HttpContext.Current,...)特定于该请求,因此不需要任何特殊处理。
对于任何类,您实例化为这些类中的局部变量或字段,以及访问Session。
但是,像往常一样,您需要同步对共享资源的访问,例如:
我在ASP.NET应用程序中经常看到线程错误,例如:没有同步的多个并发请求使用单例,导致用户A看到用户B的数据。