如何异步执行sql server存储过程并确保它完成
我有一个存储过程,当被调用时进行大量处理。 存储过程的各个部分都包含在它们自己的事务中,但是整个proc。 不会在事务中运行,因为这会导致不必要的阻塞和损害性能。 我遇到的问题是,如果用户在proc之后关闭了用户界面。 已经开始,在它结束之前,连接关闭和proc。 停止执行。
有没有办法异步执行此操作或在另一个进程中执行此操作,如果在处理期间关闭用户界面应用程序,则不会中止。
查看C#任务并行库。 您可以创建一个非常简单的任务。 例如…
Task myTask= new Task(() => { Console.WriteLine(@"hello"); //Call stored procedure here }); myTask.start();
这将与主线程并行运行包含在任务中的代码。 如果您想检查任务是否完成,您可以使用
if(myTask.IsCompleted()) { Console.WriteLine(@"My task is finished"); }
此方法避免更改存储过程并允许C#处理性能。
编辑: – 并避免主线程完成首先添加
Task.WaitAll(myTask);
这将睡眠主线程,直到任务完成。
调用SP_Start_Job来初始化存储过程。 修改存储过程以将完成标志写入表。 在应用中的线程上轮询表格。
有两种方法:
-
您可以构建在单独的线程中执行存储过程的ac#服务。 GUI只负责告诉服务启动该过程并询问该任务是否已完成。 GUI可以关闭并重新打开,服务仍然可以启动并运行。
-
运行SQL Server代理作业。 从GUI启动作业并定期检查是否已完成。
如果你只有这个sp,你需要确保完成我会选择第二个选项。 我已经尝试过将Integration Services作为“服务”的方式回来了,但它却渴望运行我们需要异步运行的进程数量…不断耗尽内存。