【问题标题】:How to execute a sql server stored procedure asynchronously and ensure it's completion如何异步执行 sql server 存储过程并确保其完成
【发布时间】:2011-09-16 11:48:05
【问题描述】:

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

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

【问题讨论】:

  • 您是否需要同时运行多个存储过程实例?您使用的是哪个版本的 SQL Server?
  • @Andres - 那是版本而不是版本,你仍然没有回答我的其他问题。询问两者的原因是看看是否可以选择 SQL 代理作业(在 express 中不可用)。
  • 我使用的是Express版,程序必须能够同时运行
  • Ah OK 对于 SQL Server 解决方案服务代理,按照@Dmitry 的链接,这绝对是前进的方向。

标签: c# sql-server-2008


【解决方案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);

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

【讨论】:

  • 如果主应用进程在任务完成之前结束,任务会发生什么?
  • @Andrew - 我已经更新了我的解决方案来展示如何解决这个问题。
  • 谢谢我玩了一下,这确实有效。我需要一种能够应对断电等情况的解决方案。
  • 您希望在断电时发生什么?我不完全明白你的意思...
  • 由于 sp 长时间运行,我想确保它完成,即使触发 sp 调用的 ui 已关闭或计算机出现电源故障。我现在正在查看 wcf 或 nservicebus。服务器上的服务可以运行 sp。请注意,计算机是平板电脑,在处理过程中很容易断电
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    两种方法:

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

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

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

    【讨论】:

      猜你喜欢
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 2018-11-29
      • 1970-01-01
      • 2011-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多