在winforms开发中,您可以创建BackgroundWorker
以避免在长时间运行的进程中锁定UI。在ASP.NET中,POST / GET基本上冻结直到完成。我没有看到添加Thread
对这个过程有什么好处。也许如果Thread
加速完成(比如在多核服务器上),它可以帮助加快速度。
在一般意义上,我可以使用AJAX进行长时间调用而不会导致网页“冻结”。从这个意义上说,AJAX可以被认为是线程的替代品。
是吗?在ASP.NET上线程化几乎没用吗?答案 0 :(得分:5)
多线程可以在以下情况下更快地提出请求:
在这种情况下,您确实可以在ASP.NET中使用多线程。人们常犯的一个错误就是产生线程然后不等待它们完成 - 例如“我将在后台线程上将他们的购买记录到数据库时响应用户。这总是一个坏主意,因为IIS可以并且将回收运行您网站的应用程序池,并且这些后台线程可能会以静默方式中止。
答案 1 :(得分:1)
如果您需要返回响应并且不想绑定服务器线程,则线程在服务器端编程中非常有用,特别是对于会导致请求超时的长时间运行的进程。
答案 2 :(得分:1)
线程可用于持续时间超过页面请求生命周期的操作,所以是的,这是有道理的。
一个例子是一个旋转进程来编码视频的线程。由于这可能需要一些时间,因此稍后可以通过AJAX或Comet或任何其他数量的机制更新客户端的编码进度。
答案 3 :(得分:1)
这取决于工作量和用例。请求/响应系统最好通过在客户端异步执行它们来实现。
如果服务器上的工作负载需要线程化,则可以并行完成工作,但每个线程应在最后连接以返回单个响应。
最重要的是,如果您获得的数据可以更快地并行加载,请执行此操作,否则请使用来自客户端的async(ajax)调用来阻止用户界面阻止
答案 4 :(得分:1)
以下是如何使用ASP.NET编程模型仍然使用多个线程的具体示例。该示例假定您可以分解将页面加载到独立工作项所需的任务。然后,您可以并行处理工作项并等待它们完成。我正在使用任务并行库来抽象出线程的显式创建,但结果都是一样的。 ASP.NET编程当然可以容纳多线程设计并从中受益。
private void Page_Load(object sender, EventArgs e)
{
ICollection<WorkItem> workitems = GetWorkItems();
Parallel.ForEach(workitems,
(item) =>
{
ProcessWorkItem(item);
});
// Now that we have all of our work items completed we can continue loading the page.
}
答案 5 :(得分:0)
我不会说在ASP.NET中线程无用,但它绝对是一个不同的模型。对于资源请求(页面请求),通常,线程由系统处理。也就是说,来自用户1的请求A可能比来自用户2的请求B花费更长时间,并且后者不会被前者带来不便。按照您的建议将该概念应用于AJAX请求,默认情况下整个模型变为多线程,并扩展到硬件可以处理的任何内容。
如果出于某种原因,请求必须生成一些长时间运行的进程并且需要在进程完成之前响应用户,那么生成线程可以非常有用。通常,非实时进程应从Web应用程序中重新分解并放入其自己的后端服务中。但是对于页面请求产生一个预期会在后台执行某些操作几分钟以便浏览器不会等待整个时间(并且可能超时)的页面请求并非完全闻所未闻。