如何异步执行sql server存储过程并确保它完成

时间:2011-09-16 11:48:06

标签: c# sql-server-2008

我有一个存储过程,当被调用时会进行大量处理。存储过程的各个部分都包含在它们自己的事务中,但是整个proc。不会在事务中运行,因为这会导致不必要的阻塞和损害性能。我遇到的问题是,如果用户在proc之后关闭用户界面。已经开始,在它结束之前,连接关闭和proc。停止执行。

有没有办法异步执行此操作,或者在处理期间关闭用户界面应用程序时不会中止的其他进程。

3 个答案:

答案 0 :(得分:1)

查看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);

这将睡眠主线程,直到任务完成。

答案 1 :(得分:1)

调用SP_Start_Job初始化存储过程。修改存储过程以将完成标志写入表。在应用程序的线程上轮询表格。

答案 2 :(得分:0)

两种方法:

  1. 您可以构建一个c#服务,该服务在单独的线程中执行存储过程。 GUI只负责告诉服务启动该过程并询问该任务是否已完成。 GUI可以关闭并重新打开,服务仍然可以启动并运行。

  2. 运行SQL Server代理作业。从GUI启动作业并定期检查是否已完成。

  3. 如果你只有这个只有你需要确保完成的sp我会选择第二个选项。我已经尝试过将Integration Services作为“服务”的方式,但我们还是渴望运行我们需要异步运行的进程数量......不断耗尽内存。