1

经过多年的编程,我第一次需要异步做一些事情(因为它需要几分钟并且网页超时 - 无论如何都不希望用户等待那么长时间)。此操作仅由少数人完成,但每天可以执行几次(针对每个人)。

从使用 LINQ 的 ASP.NET 网页上单击“保存”,我将一条记录插入到 SQL Server 表中。然后触发一个 SSIS 包将该记录推送到全国其他几个数据库。

所以..

  1. 我怎样才能(希望简单地)使这个异步,以便用户可以继续做其他事情?

  2. 这应该设置在.NET 端还是 SQL 端?

  3. 有没有办法(几分钟后)用户可以知道该过程已经完成并成功?也许是一封电子邮件?不知道用户如何知道它完成得很好。

我在这个网站上阅读了一些关于它的线程,但它们是从 2009 年开始的,所以不确定现在与 Visual Studio 2012/.NET Framework 4.5 是否有很大不同(我们仍在使用 SQL Server 2008 R2)。

4

2 回答 2

1

在 ASP.Net 中执行长时间运行的任务通常是个坏主意。一方面,如果应用程序池在任务完成之前被回收,它就会丢失。

我建议将请求写入数据库表,并使用单独的 Windows 服务来完成长时间运行的工作。它可以更新数据库表中的状态列,稍后可以检查以查看任务是否完成以及是否有错误。

于 2013-03-20T23:40:08.570 回答
0

您可以在 SQL 端使用 Service Broker;这是消息队列的 SQL Server 实现。这里这里的好例子

您所做的是创建一个 Service Broker 服务并定义一些脚手架(队列、消息类型等)。然后创建一个服务“激活”过程,它基本上是一个使用队列中消息的存储过程。例如,该 SP 将收到一条带有表中记录 ID 的消息,然后继续执行任何需要对其执行的操作,可能在完成后发送一封电子邮件等。

因此,从您的代码隐藏中,您将调用一个简单的存储过程,它将用户的数据插入到一个表中,并向队列发送一条消息,例如新记录的 ID,然后立即返回。我想你应该提前告诉用户这可能需要几分钟,他们会收到一封电子邮件等。

Service Broker 的优点是消息传递几乎得到保证 - 即使您的 SQL Server 在消息排队后立即崩溃,当您将其恢复时,激活 SP 将再次启动,因此它非常强大。

于 2013-03-21T00:10:06.793 回答