【问题标题】:What happens if you fire a background thread to execute right before ASP.NET completes its page processing?如果在 ASP.NET 完成页面处理之前触发后台线程执行会发生什么?
【发布时间】:2009-02-03 01:52:41
【问题描述】:

如果我在 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...
}

【问题讨论】:

    标签: asp.net multithreading behavior


    【解决方案1】:

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

    你的代码和我的唯一区别是我使用线程池而不是设置一个新线程。

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

    【讨论】:

    • 这正是我所关心的。我做过类似的事情,它似乎工作正常,但你永远不知道...... ;) 这就是为什么我想找出“官方”ASP.NET 行为是什么的原因。
    • 您尝试过会话结束时会发生什么吗?我特别想知道这个案子。
    • 我觉得官方建议不要做。相反,您应该将作业传递给一个服务或其他一些远程进程,以保证您能够存活足够长的时间
    • 我将检查我的代码是否在任何地方用于生产,并尝试检查会话结束时会发生什么。我猜应该很容易检查。
    • 我做了一些检查,我们还没有在生产中使用它。我将尝试设置一个测试,看看会话超时时会发生什么。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      一位同事最近为一些数据导出做了此操作。客户端将登录到控制面板(基于 Web),然后点击一些按钮,然后文件将通过 FTP 传输到某个神秘的服务器。

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

      AJAX 用于更新 UI 中的进度条和状态行,这在理论上很好,而数据集只有几百行。但是,一旦我们开始使用真实的数据集(数百万行),整个 UI 就会不断出现超时错误。此时你与后台线程失去了联系......

      它还在运行吗? 出口完成了吗? 如果我刷新页面并再次按下按钮会发生什么? 履行机构会向人们发送两种产品吗?

      这是一场噩梦。他目前正在重新编写它以作为控制台应用程序运行,该应用程序与 Windows 任务调度程序连接到一个包含需要执行的导出详细信息的作业表。

      如果这看起来有点笨拙,您可以随时使用 socket server 编写长时间运行的进程,并让您的 aspx 代码隐藏与之通信。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-08-03
          • 1970-01-01
          • 1970-01-01
          • 2011-12-23
          相关资源
          最近更新 更多