异步运行存储过程

Mat*_*son 6 c# stored-procedures

我一直在玩下面的代码.单击按钮时,想法是存储过程运行并使用随机数量的虚拟记录更新表(现在,无论如何,我正在玩).

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();
        }
Run Code Online (Sandbox Code Playgroud)

我编写的存储过程使用循环添加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
Run Code Online (Sandbox Code Playgroud)

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

conn.Open();
cmd.ExecuteNonQueryAsync();
conn.Close();
Run Code Online (Sandbox Code Playgroud)

这个问题是它似乎没有按照我期望的方式工作,我只从存储过程中向表中添加一行.

任何人都可以指出我正确的方向为什么这不符合我的要求?

use*_*861 6

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

cmd.CommandTimeout = TimeSpan.FromMinutes(30).TotalSeconds;
Run Code Online (Sandbox Code Playgroud)

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

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


小智 5

你是这个意思?:

using System.Threading.Tasks;
Run Code Online (Sandbox Code Playgroud)

.

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();
              })
    }
Run Code Online (Sandbox Code Playgroud)