5

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

4 回答 4

1

我已经对相同类型的代码进行了一些试验,在单独的线程中进行了一些耗时的日志记录。它似乎运行良好,但我尚未在生产环境中对其进行测试。

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

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

于 2009-02-02T08:42:10.307 回答
1

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

于 2009-02-02T08:59:44.360 回答
1

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

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

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

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

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

如果这看起来有点笨拙,你总是可以用一些套接字服务器编写你的长时间运行的进程,并让你的 aspx 代码隐藏与它通信。

于 2009-02-02T17:52:41.273 回答
0

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

于 2009-02-02T08:43:52.050 回答