在ASP.Net应用程序中生成新线程是否有风险

在ASP.Net应用程序中生成新线程是否有风险,asp.net,multithreading,Asp.net,Multithreading,在ASP.Net应用程序中,是否可以像下面的代码中那样生成新线程,或者存在一些隐藏的风险 在这段代码中,我正在这个新生成的线程上执行一些需要很长时间才能执行的代码,比如2到5分钟。生成的线程不是背景线程 我在想,如果有很多用户点击“btnLongRequest”按钮,那么这意味着会产生很多新线程,这可能不是一件好事,但也不确定 protected void btnLongRequest_Click(object sender, EventArgs e) { LongOps l

在ASP.Net应用程序中,是否可以像下面的代码中那样生成新线程,或者存在一些隐藏的风险

在这段代码中,我正在这个新生成的线程上执行一些需要很长时间才能执行的代码,比如2到5分钟。生成的线程不是背景线程

我在想,如果有很多用户点击“btnLongRequest”按钮,那么这意味着会产生很多新线程,这可能不是一件好事,但也不确定

 protected void btnLongRequest_Click(object sender, EventArgs e)
 {
        LongOps lo = new LongOps();
        Thread t = new Thread(new ThreadStart(lo.LongOp));
        t.Priority = ThreadPriority.Lowest;
        t.Start();
 }
你能容忍这项工作偶尔在没有通知的情况下丢失吗

如果您开始耗尽线程池限制(不是因为您正在使用自己的线程),那么拥有多个线程将成为一个问题。或者,您正在使机器过载并耗尽一些资源,如CPU、内存(每个线程默认有1MB的堆栈大小)、磁盘或网络


如果您避免了这些问题,您就没事了。

操作系统只支持有限数量的线程,一旦超过了这些线程,您就无法创建线程anymore@usr,我在此线程上执行的代码需要可靠地运行。我可以将长操作代码放在一个try-catch中,这样可以防止任何异常导致AppDomain崩溃,但正如paulm提到的,生成这样的线程的数量是有限制的。@usr,我看到的唯一问题是如果AppPool被回收,导致代码执行突然停止,或者如果操作系统不允许创建更多的线程,而如果大量用户长时间点击页面,则可能会发生这种情况。因此,我生成新线程的方法总是有一定程度的不可靠性。@paulm限制太高了。实际上,记忆是一个限制因素。10k线程对于操作系统来说完全可以,但是它们消耗10GB的内存。异步IO是一个通用概念。基本上,.NET中的所有异步API(例如Stream.ReadAsync而不是Stream.Read)都向操作系统发出异步IO。如果你使用这些(以任何你喜欢的方式——最现代的等待方式),你将不会在IO期间阻塞线程。这将取决于你希望点击该按钮的用户数量。为每个请求创建一个线程不是很容易扩展的。如果请求真的需要5分钟,我认为您需要一些专门的后台任务来处理这些请求,并在收到意外数量的请求时将它们排队。@XavierLeclercq,排队是指使用windows服务,或者仍然可以在ASP.Net应用程序中完成?是的,我会为此创建一个单独的服务。我不知道这有多可行,因为我没有所有的细节。但是一个可能需要2-5分钟的请求非常长。当需要重新启动服务器或发生崩溃时会发生什么情况?无论如何,您都希望执行请求。所以你需要某种坚持。