如何调用存储过程而不等待它完成?

时间:2009-12-22 06:45:38

标签: .net sql stored-procedures informix

如何从Web服务方法调用存储过程而不必等待存储过程完成,并让方法完成所有其他活动?

作为一个例子(不是实际情况,但更容易理解): 我有一个1000万行的桌子,每年我都要根据土壤,建筑物等来计算每个房子的价值。

在年底之前,我提供土壤和建筑的新参数,然后让数据库计算每个房屋的价值(使用从Web服务方法调用的存储过程),但可能需要数小时。在同样的方法中,我希望能够告诉系统我已经开始计算(在它开始之后,而不是之前)。

所以这里我如何避免超时,让我的网络应用程序继续做其他事情。

谢谢。

4 个答案:

答案 0 :(得分:8)

如果不依赖于存储过程的结果,可以将存储过程调用包装在方法中并使用

调用它。
        Thread statisticsThread = new Thread(new ThreadStart(YourSPWrapper));
        statisticsThread.Priority = ThreadPriority.Lowest;
        statisticsThread.Start();

答案 1 :(得分:2)

你在谈论召唤一个什么都不返回的SP?就像在服务器上开始工作一样?

您可以尝试使用异步委托来执行此操作,线程池可能是最简单的:

ThreadPool.QueueUserWorkItem(myDelegateFunction);

protected void myDelegateFunction(object state) {
   //make your db call here and let the delegate fall out of scope
   //if you need to set a variable saying it succeeded, set a global here
}

然后,您可以随时启动委托,当有可用的线程资源时,它将在异步委托中执行。

答案 2 :(得分:1)

也许考虑使用SQL Server代理将查询安排为作业? 如果工作需要定期运行或很少运行,这尤其值得。

如果绝对必要,您还可以使用SQL脚本根据您的webapp按需计划作业。只需确保代理服务正在运行,否则您的工作将无法启动。

答案 3 :(得分:1)

使用IBM Informix Dynamic Server 11,您可以考虑通过DB-Cron任务调度程序运行该过程。该程序将作为同步数据库请求启动该操作,但该任务不需要在请求完成之前完成。