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

C# 如何异步执行sql server存储过程并确保它';完成,c#,sql-server-2008,C#,Sql Server 2008,我有一个存储过程,调用它时会进行大量处理。存储过程的各个部分都封装在它们自己的事务中,但整个过程都是这样。不会在事务中运行,因为这将导致不必要的阻塞并损害性能。我的问题是,如果用户在进程结束后关闭用户界面。已启动,在其结束之前,连接将关闭,进程将停止。停止执行 如果用户界面应用程序在处理过程中关闭,是否有任何方法可以异步或在另一个不会中止的进程中执行此操作。查看C#Task并行库。 您可以创建一个非常简单的任务。例如 Task myTask= new Task(() => {

我有一个存储过程,调用它时会进行大量处理。存储过程的各个部分都封装在它们自己的事务中,但整个过程都是这样。不会在事务中运行,因为这将导致不必要的阻塞并损害性能。我的问题是,如果用户在进程结束后关闭用户界面。已启动,在其结束之前,连接将关闭,进程将停止。停止执行

如果用户界面应用程序在处理过程中关闭,是否有任何方法可以异步或在另一个不会中止的进程中执行此操作。

查看C#Task并行库。 您可以创建一个非常简单的任务。例如

    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\u Start\u Job初始化存储过程。修改存储过程以将完成标志写入表。在应用程序中的线程上轮询表。

有两种方法:

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

  • 正在运行SQL Server代理作业。从GUI启动作业,并定期检查作业是否已完成


  • 如果你只有这个sp,你需要确保完成,我会选择第二个选项。我早就尝试过将集成服务作为“服务”来使用,但它对运行异步运行所需的进程数量非常渴望。。。内存不断耗尽。

    您是否需要同时运行多个存储过程实例?您使用的是哪一版本的SQL Server?@Andres-这是版本而不是版本,您仍然没有回答我的另一个问题。询问两者的原因是为了查看SQL代理作业(在express中不可用)可能是一个选项。尝试此操作我使用的是Express edition,该过程必须能够根据@Dmitry的链接对SQL Server解决方案service broker同时运行H OK(确定)。如果主应用程序进程在任务完成之前结束,任务会发生什么情况?@Andrew-我已将解决方案更新为展示这是如何解决的。谢谢,我有一个游戏,这确实是一种工作。我需要一个能够适应断电等情况的解决方案。如果断电,您希望发生什么情况?我不完全理解您的意思…由于sp正在长时间运行,我希望确保即使触发sp调用的ui已关闭或计算机出现电源故障,它也能完成。我现在在看wcf或者nservicebus。服务器上的服务可以运行sp。请注意,这些计算机是平板电脑设备,在处理过程中很容易断电