如果在ASP.NET完成页面处理之前启动后台线程执行,会发生什么情况?

如果在ASP.NET完成页面处理之前启动后台线程执行,会发生什么情况?,asp.net,multithreading,behavior,Asp.net,Multithreading,Behavior,如果我在ASP.NET页面生命周期结束之前剥离一个线程来执行一个长时间运行的进程,会发生什么?ASP.NET运行时是否会终止线程?这会导致未定义的行为吗 下面是一个代码示例,它在Page_Load事件中旋转后台线程。这样做安全吗 protected void Page_Load(object sender, EventArgs e) { Thread newThread = new Thread(new ThreadStart(SomeLongRunningMethod)); n

如果我在ASP.NET页面生命周期结束之前剥离一个线程来执行一个长时间运行的进程,会发生什么?ASP.NET运行时是否会终止线程?这会导致未定义的行为吗

下面是一个代码示例,它在Page_Load事件中旋转后台线程。这样做安全吗

protected void Page_Load(object sender, EventArgs e)
{
    Thread newThread = new Thread(new ThreadStart(SomeLongRunningMethod));
    newThread.IsBackground = true;
    newThread.Start();
}

private void SomeLongRunningMethod()
{
    // some long running process goes here...
}

我已经用相同类型的代码做了一些实验,在一个单独的线程中做了一些耗时的日志记录。它似乎工作得很好,但我还没有在生产环境中测试过它

您的代码和我的代码之间的唯一区别是我使用了线程池,而不是设置新线程


您可能会复制任何请求数据和其他页面信息,以避免它们被丢弃,但除此之外,我认为这应该可以很好地工作。

请注意IIS worker回收设置,因为这些设置在线程启动后仍然会影响线程。确保捕获任何异常并记录它们。

我已经使用ffmpeg对用户在web表单上上传的电影进行了som视频转换/处理,它工作得非常好,即使线程需要几个小时才能完成!
请记住,很难找到线程的状态,因此日志记录和错误处理非常重要。

一位同事最近为一些数据导出做了这项工作。客户端会登录到一个控制面板(基于web),然后点击一些按钮,然后一个文件会被FTP发送到某个神秘的服务器

前端是使用ASP AJAX完成的,就像@bang所说的,线程执行得很好,但要跟踪它绝对是一个垃圾

AJAX用于更新UI中的进度条和状态行,这在理论上很好,而数据集只有几百行。但是,当我们开始使用真实的数据集(数百万行)时,整个用户界面都出现了超时错误。此时,您将与背景线程失去联系

它还在运行吗? 出口结束了吗? 如果我刷新页面并再次按下按钮,会发生什么? 履行之家会给乡亲们送两种产品吗

这有点像噩梦。他目前正在重新编写它,作为一个控制台应用程序运行,windows任务调度器连接到一个作业表,其中包含需要执行的导出的详细信息


如果这看起来有点不对劲,您可以用一点a编写长期运行的流程,并让您的aspx代码与之进行通信。

这正是我关心的问题。我做过类似的事情,似乎效果不错,但你永远不知道……;)这就是为什么我想知道ASP.NET的“官方”行为是什么。您尝试过会话结束时会发生什么吗?我特别想知道这件事。我认为官方的建议是不要这样做。相反,您应该将作业传递给一个服务或其他远程进程,您可以保证该进程将长期存在。我将检查我的代码是否在任何地方的生产中使用,并尝试检查会话结束时会发生什么。我想这应该很容易检查。我做了一些检查,但我们还没有在生产中使用它。我将尝试设置一个测试,看看会话超时时会发生什么。