Asp.net mvc 为什么ASP.NET MVC中的线程被中止(再次)?

Asp.net mvc 为什么ASP.NET MVC中的线程被中止(再次)?,asp.net-mvc,exception,multithreading,Asp.net Mvc,Exception,Multithreading,以下是我在控制器操作中所做的操作: 创建并启动一个执行较长处理任务的新线程(平均约30秒,但可能需要几分钟) 立即返回页面响应,以便用户知道处理已经开始(通常是一个带有任务ID的Json,用于轮询) 在某个随机点,会抛出ThreadAbortException,因此异步任务不会完成。异常并不是每次都抛出,它只是在大约25%的时间内随机发生 注意事项: 我没有调用Response.End或Response.Redirect-抛出异常时甚至没有运行请求 我尝试使用ThreadPool,得到了相同的

以下是我在控制器操作中所做的操作:

  • 创建并启动一个执行较长处理任务的新线程(平均约30秒,但可能需要几分钟)
  • 立即返回页面响应,以便用户知道处理已经开始(通常是一个带有任务ID的Json,用于轮询)
  • 在某个随机点,会抛出ThreadAbortException,因此异步任务不会完成。异常并不是每次都抛出,它只是在大约25%的时间内随机发生

    注意事项:

    • 我没有调用Response.End或Response.Redirect-抛出异常时甚至没有运行请求
    • 我尝试使用ThreadPool,得到了相同的行为
    • 我知道在ASP.NET中运行线程有几个注意事项,但我现在不在乎

    有什么建议吗?

    问题是你不应该这样做。如果您需要一个任务在后台长时间运行,ASP.Net应该生成一个进程来处理它,或者将工作项添加到Windows服务要处理的队列中。

    这是否有帮助,因为您想启动并忘记它

    "Delegates provide a method called BeginInvoke that allows us to call the delegate asychronously."
    

    使用一个

    怎么样?问题是该应用程序正在被回收。我非常清楚,当这种情况发生时,所有线程都会中止,我不希望应用程序能够回收。原因是异步进程使用了存储在应用程序根目录中的已更改临时文件,这导致了循环


    我觉得自己很笨。

    对不起,斯宾塞,但我已经说过,我知道这是一种进行异步处理的次优方式,但在我的情况下,没有其他方式。不幸的是,它不仅仅是次优方式。这实际上是错误的,不是为这种用途而设计的。跟踪确定如何防止IIS终止长时间运行的线程的方法可能是一项具有不可预见后果的黑客工作。如果没有别的办法,那就是你的环境出了问题。我同意你的看法。无论如何,我找到了一种方法来产生一个进程,我只需要验证它是否有效。@Ryan-哈哈,谢谢。有时我想知道有多少人认为这只是我的默认化身。这是一个显而易见的选择,但我似乎不知道如何以简单的方式向用户报告进度。最后,用户看到页面“卡住”很长时间,这是不可接受的。无论如何,我都必须使用AJAX调用,所以我想我会首先尝试Spencer建议的流程解决方案。我会尝试一下,但是我怀疑行为会是一样的。此外,调用EndInvoke的需要使事情变得复杂,因为启动调用的原始线程是ASP.NET线程池线程,因此它可能已经用于服务另一个请求。