如何从Web服务方法调用存储过程而不必等待存储过程完成,并让方法完成所有其他活动?
作为一个例子(不是实际情况,但更容易理解): 我有一个1000万行的桌子,每年我都要根据土壤,建筑物等来计算每个房子的价值。
在年底之前,我提供土壤和建筑的新参数,然后让数据库计算每个房屋的价值(使用从Web服务方法调用的存储过程),但可能需要数小时。在同样的方法中,我希望能够告诉系统我已经开始计算(在它开始之后,而不是之前)。
所以这里我如何避免超时,让我的网络应用程序继续做其他事情。
谢谢。答案 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任务调度程序运行该过程。该程序将作为同步数据库请求启动该操作,但该任务不需要在请求完成之前完成。