20

是否可以在ASP.NET 2.0 中使用 BackGroundWorker 线程用于以下场景,使浏览器端的用户不必等待很长时间?

设想

  1. 浏览器请求一个页面,比如 SendEmails.aspx
  2. SendEmails.aspx 页面创建一个 BackgroundWorker 线程,并为该线程提供足够的上下文来创建和发送电子邮件。
  3. 浏览器收到来自 ComposeAndSendEmails.aspx 的响应,表示正在发送电子邮件。
  4. 同时,后台线程正在进行创建和发送电子邮件的过程,这可能需要相当长的时间才能完成。

我主要关心的是保持 BackgroundWorker 线程运行,尝试发送 50 封电子邮件,而 ASP.NET workerprocess 线程池线程早已不复存在。

4

7 回答 7

13

如果您不想使用 AJAX 库,或者电子邮件处理真的很长并且会使标准 AJAX 请求超时,您可以使用 AsynchronousPostBack 方法,这是 .net 1.1 天的“旧技巧”。

本质上,您所做的是让您的提交按钮以异步状态开始电子邮件处理,同时将用户带到中间页面。这样做的好处是您可以根据需要尽可能多地刷新中间页面,而不必担心达到标准超时。

当您的后台进程完成后,它会在数据库/应用程序变量/任何东西中放置一个小的“完成”标志。当您的中间页面刷新自身时,它会检测到此标志并自动将用户重定向到“完成”页面。

同样,AJAX 使所有这些都没有实际意义,但如果由于某种原因您有一个非常密集或及时的过程必须通过 Web 完成,那么这个解决方案将适合您。我在这里找到了一个很好的教程,还有更多。

当我们在开发一个与第三方应用程序交互的“网络签到”类型的应用程序时,我不得不使用这样的过程,并且它们的导入 API 非常慢。

编辑:嘎!诅咒你古兹拉尔和你神一样的打字能力 8^D。

于 2008-09-11T23:00:23.770 回答
7

您不应该从 ASP.NET 页面执行任何线程。当工作进程回收时,任何长时间运行的线程都有被杀死的危险。你无法预测何时会发生这种情况。任何长时间运行的进程都需要由 Windows 服务处理。例如,您可以通过在 MSMQ 中删除消息来启动这些过程。

于 2008-09-11T23:20:28.417 回答
6
ThreadPool.QueueUserWorkItem(delegateThatSendsEmails)

或在 System.Net.Mail.SmtpServer 上使用 SendAsync 方法。

您想将电子邮件发送代码放在另一个线程上,因为这样它会立即返回用户,并且只会处理,无论需要多长时间。

于 2008-09-11T22:52:39.047 回答
2

有可能的。从页面异步启动新线程后,页面请求将继续并将页面发送回用户。异步线程将继续在服务器上运行,但不再有权访问会话。

如果您必须显示任务进度,请考虑一些 Ajax 技术。

于 2008-09-11T22:55:56.573 回答
2

对于这种情况,您需要使用异步页面,这是 ASP.NET 2.0 中添加的一项功能

异步页面为 I/O 绑定请求引起的问题提供了一个巧妙的解决方案。页面处理在线程池线程上开始,但是一旦异步 I/O 操作开始响应来自 ASP.NET 的信号,该线程就会返回到线程池。操作完成后,ASP.NET 从线程池中获取另一个线程并完成对请求的处理。可伸缩性增加是因为线程池线程的使用效率更高。原本会等待 I/O 完成的线程现在可以用于服务其他请求。直接受益者是不执行冗长 I/O 操作并因此可以快速进出管道的请求。

http://msdn.microsoft.com/en-us/magazine/cc163725.aspx

于 2008-09-11T23:28:37.197 回答
2

如果你想在你的 ASP 页面中使用多标题,你可以使用这样的简单线程模型:

{
    System.Threading.Thread _thread = new Thread(new ThreadStart(Activity_DoWork));
    _thred.Start();
}
Activity_DoWork()
{
    /*Do some things...
}

此方法适用于 ASP 页。带有 BackgroundWorker 的 ASP 页面不会启动,而 BackgroundWorker 将完成。

于 2009-01-10T14:24:02.137 回答
2

5 年后,问题依旧……如果你想从你的应用程序中执行即发即弃的操作并且忘记与 ASP.NET 应用程序中的后台作业处理相关的所有困难,你可以使用http://hangfire.io

  • 它不会丢失您在回收过程中的工作,因为它使用持久存储来保存有关后台工作的信息。
  • 它会自动重试因暂时异常(SMTP 服务器连接错误)而中止或失败的后台作业。
  • 它允许您通过集成的 Web 界面轻松调试后台作业。
  • 安装/配置/使用 HangFire 非常容易。

还有教程Sending Mail in Background with ASP.NET MVC for using HangFire with Postal

于 2014-06-10T17:33:28.017 回答