在我们用 c# 编写的 .NET 3.5 网站上,用户单击我们网页上的提交,他们通过电子邮件地址订阅我们的报告。不幸的是,此操作大约需要 5 分钟,用户必须坐下来等待确认。我想做的是更改它,以便当他们单击提交时,他们会弹出一个弹出窗口,说他们将在订阅完成时收到电子邮件通知,同时我会将订阅操作排队到服务器上的其他位置,以便它不存在于网络代码中。你能给我一些方法来做到这一点吗?基本思想是我想分成两条不同的执行线,一条允许他们仍然浏览我们的网站,另一条将订阅它们。我正在考虑拆分为一个新线程,但我认为 Web 代码仍然必须等待该线程完成才能执行其他任何操作。我正在寻找想法,最好是可以在同一台服务器上运行的东西。谢谢!
3 回答
有很多选择,但基本方法是将站点与提供者分离。相反,您将写出一条记录说“用户 X 正在等待订阅”,然后一个单独的进程将读取该记录并执行实际订阅,同时将该记录标记为“进行中”。一旦该过程完成,记录将再次使用已完成的信息进行更新。
您可以使用数据库、消息队列或其他方法来实现这一点。但从根本上说,您的站点将只负责创建记录并检查其状态——与提供者的实际交互将单独处理。
如果您有需要这么长时间的事情,并且您想实现并确保行动通过,那么您最好的选择是将其排队。
基本上,当他们提交请求时,将其存储在数据库表中并让他们继续前进。同时,有另一个进程监视该表以处理请求。当他们进来时,只需让第二个过程将请求发送到需要 5 分钟才能完成的部分。
完成后,向他们发送“欢迎使用某某电子邮件列表”消息。这将作为他们对它有效的确认。
杰夫阿特伍德不久前在博客上发表了一个相关主题。由于您使用的是 c#,因此我假设您使用的是 ASP.NET,并且可以利用缓存机制来启动定期工作者作业。根据用户的请求,您可以将订阅的详细信息保存到某些数据存储中。在该作业中,您可以检查队列以确定需要创建哪些订阅,然后执行它们。
https://blog.stackoverflow.com/2008/07/easy-background-tasks-in-aspnet/