是否可以在ASP.NET 2.0中使用BackGroundWorker线程用于以下场景,以便浏览器端的用户不必等待很长时间?
浏览器请求一个页面,比如SendEmails.aspx
SendEmails.aspx页面创建一个BackgroundWorker线程,并为线程提供足够的上下文来创建和发送电子邮件.
浏览器接收来自ComposeAndSendEmails.aspx的响应,表示正在发送电子邮件.
同时,后台线程正在进行创建和发送电子邮件的过程,这可能需要相当长的时间才能完成.
我主要担心的是保持BackgroundWorker线程运行,尝试发送,比如说,当ASP.NET工作进程线程池线程早已消失时,发送50封电子邮件.
如果您不想使用AJAX库,或者电子邮件处理非常长并且会使标准AJAX请求超时,则可以使用AsnetPackBack方法,该方法是.net 1.1天中的"旧hack".
基本上,您所做的是让您的提交按钮以异步状态开始电子邮件处理,同时将用户带到中间页面.这样做的好处是,您可以根据需要刷新中间页面,而无需担心达到标准超时.
当你的后台进程完成后,它会在数据库/应用程序变量/中添加一些"完成"标志.当您的中间页面自行刷新时,它会检测到此标志并自动将用户重定向到"完成"页面.
同样,AJAX使所有这一切都没有实际意义,但如果由于某种原因你必须通过网络完成一个非常密集或及时的过程,这个解决方案将适合你.我在这里找到了一个很好的教程,还有更多的教程.
当我们处理与第三方应用程序连接的"web check-in"类型应用程序时,我不得不使用这样的过程,并且它们的导入API非常慢.
编辑:GAH!诅咒你Guzlar和你的神像打字能力8 ^ D.
您不应该从ASP.NET页面执行任何线程.任何长时间运行的线程都有在工作进程回收时被杀死的危险.你无法预测何时会发生这种情况.任何长时间运行的进程都需要由Windows服务处理.例如,您可以通过在MSMQ中删除消息来启动这些过程.
ThreadPool.QueueUserWorkItem(delegateThatSendsEmails)
或者在System.Net.Mail.SmtpServer上使用SendAsync方法.
您希望将电子邮件发送代码放在另一个线程上,因为它会立即返回该用户,并且无论需要多长时间都会处理.