异步运行存储过程

本文关键字:存储过程 运行 异步 | 更新日期: 2023-09-27 18:20:13

我一直在摆弄下面的代码。当单击该按钮时,其想法是一个存储过程运行并用随机数目的伪记录更新一个表(目前,无论如何,在我玩的时候)。

protected void Button1_Click(object sender, EventArgs e)
        {
            SqlConnection conn = new SqlConnection("Data Source=MATT''RICHARDSON2008R2;Initial Catalog=Minerva;User ID=User;Password=password; Asynchronous Processing=True");
            SqlCommand cmd = new SqlCommand("exec UpdateRandomData '" + UpdateID.Text + "'",conn);
            conn.Open();
            cmd.ExecuteNonQuery();
            conn.Close();
        }

我编写的存储过程使用循环添加了100000行(以模拟可能需要一些时间才能运行的过程):-

ALTER procedure [dbo].[UpdateRandomData]
    @updateID varchar(50)
as
declare @count int = 1;
declare @theDate datetime = getdate();
declare @total int  =FLOOR(rand() * 100000);
while @count < 100001
begin
    insert into RandomData (randnumber, updateID, updatedDate)
    values 
    (FLOOR(rand() * 1001), @updateID, @theDate)
    set @count += 1;
end
GO

当我运行上面的C#代码时,在存储过程完成运行之前,我会超时,所以我尝试了cmd.ExecuteNonQueryAsync();:-

conn.Open();
cmd.ExecuteNonQueryAsync();
conn.Close();

这样做的问题是,它似乎没有按我期望的方式工作,而且我只从存储过程中向表中添加了一行。

有人能给我指明正确的方向吗?为什么这不能像我想要的那样奏效?

异步运行存储过程

异步运行此程序不是解决方案。你必须更改超时时间。您可以调整SqlCommand的超时。它是一个整数,表示等待响应的秒数。我通常这样设置以避免混淆:

cmd.CommandTimeout = TimeSpan.FromMinutes(30).TotalSeconds;

要无限期等待,请将"命令超时"设置为零。我认为您还需要设置SqlConnection的ConnectionTimeout属性。

此外,您应该将using模式用于SqlConnection和SqlCommand对象。

你是这个意思吗?:

using System.Threading.Tasks;

protected void Button1_Click(object sender, EventArgs e)
    {
        Task.Run(() => {
                   SqlConnection conn = new SqlConnection("Data Source=MATT''RICHARDSON2008R2;Initial Catalog=Minerva;User ID=User;Password=password; Asynchronous Processing=True");
                   SqlCommand cmd = new SqlCommand("exec UpdateRandomData '" + UpdateID.Text + "'",conn);
                   conn.Open();
                   cmd.ExecuteNonQuery();
                   conn.Close();
              })
    }

实现这一点的一种方法是使用sp_start_job

这允许您执行sp,而不必等待它完成。