如果在 ASP.NET 完成其页面处理之前触发一个后台线程来执行,会发生什么情况?
-
20-08-2019 - |
题
如果我在 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...
}
解决方案
我已经做了一些尝试用做一些时间在单独的线程消耗记录相同类型的代码。它似乎运作良好,但我还没有在生产环境中进行了测试。
你的代码和我之间唯一的区别是,我使用的线程池,而不是建立一个新的线程。
您可能会做出任何请求数据和其他页面的信息,以避免他们的副本布置但除此之外,我认为这应该很好地工作。
其他提示
我已经使用 ffmpeg 对用户在网络表单上上传的电影进行了一些视频转换/处理,并且效果非常好,即使该线程需要几个小时才能完成!非常重要的是要记住,很难找出线程的状态,因此日志记录和错误处理极其重要。
一个同事最近做了这样一些数据导出。客户端将登录到控制面板(基于web),然后按下某些按钮,什么不是,然后文件将被关闭FTP'd一些神秘服务器。
在前端使用ASP AJAX做,像@bang说,该线程执行良好,但它是一个绝对的狗屎跟踪。
AJAX是用来更新这是在理论上不错的UI进度条和状态行,而数据集只有几百行。但是,一旦我们开始与真实数据集的工作(数百万行的)整个UI跟上超时错误轰炸了。在这一点上你失去了后台线程触摸...
时它仍在运行? 已出口完成了吗? 如果我刷新页面,再次按下该按钮会发生什么? 将在履行中心两个产品发送给乡亲?
这有点恶梦。他目前正在重新书写它如期连接好到包含需要做出口的细节的工作表中的Windows任务调度控制台应用程序运行。
如果这似乎有点shonkey,你可以总是有点的套接字服务器和有你的aspx代码隐藏与该通信。
要注意的IIS工作循环设置,这些仍然会影响您的线程已经启动之后。确保你捕获任何异常并记录它们。