C# 浏览器关闭后继续执行存储过程

C# 浏览器关闭后继续执行存储过程,c#,asp.net,sql-server-2008-r2,C#,Asp.net,Sql Server 2008 R2,我有一个向20k发送电子邮件的存储过程,我从一个.NET网页调用它,该网页将参数传递给它。发送需要一些时间,如果页面关闭,发送将停止 我希望将参数传递给过程,并让它运行直到完成 要做到这一点,最好的方法是创建SSIS包并从web页面开始?如果是这样,我可以将参数传递给包并关闭浏览器吗?我想调用SSIS包仍然是同步的。您需要将它们解耦,并让它们异步运行 这看起来是Windows服务的一个很好的候选者。您的网页可以设置一个标志来驱动服务的控制逻辑 否则,只需设置一个Sql代理作业,该作业在给定的时间

我有一个向20k发送电子邮件的存储过程,我从一个.NET网页调用它,该网页将参数传递给它。发送需要一些时间,如果页面关闭,发送将停止

我希望将参数传递给过程,并让它运行直到完成


要做到这一点,最好的方法是创建SSIS包并从web页面开始?如果是这样,我可以将参数传递给包并关闭浏览器吗?

我想调用SSIS包仍然是同步的。您需要将它们解耦,并让它们异步运行

这看起来是Windows服务的一个很好的候选者。您的网页可以设置一个标志来驱动服务的控制逻辑


否则,只需设置一个Sql代理作业,该作业在给定的时间间隔内轮询数据库,如果设置了该标志,则开始发送电子邮件。当然,在网页上设置标志。这将使它们解耦。

您可以通过创建具有SSIS执行步骤的SqlAgent作业,并使用存储过程异步启动SSIS作业。更详细地介绍了此选项。如果您采用这种方式,我不会尝试将参数直接传递给作业(我知道的唯一方法是动态创建作业)。相反,我只需在数据库队列表中插入一些值,并有一个处理该队列的包

您可能还对某些允许在asp.net中运行后台任务的框架(例如)感兴趣

是另一种流行的背景工作框架

Scott Hanselman在中介绍了其中的几个选项(请务必注意Asp.net后台任务可能因应用程序池回收等原因而失败的方式)


但是,无论您采取何种方法,都不应假定作业已成功完成-换句话说,您需要维护某种发送电子邮件队列,如果出现故障,该队列将重试。

感谢您的关注。如果使用代理作业,如何将网页上收集的参数传递给过程?我可以从网页开始作业吗?不要将作业与网页耦合。网页应仅在数据库中设置一个标志(bool字段),指示有电子邮件要发送,并且当下次作业运行时,应检查该标志并决定发送电子邮件并重置它。