C# 异步运行存储过程

C# 异步运行存储过程,c#,stored-procedures,C#,Stored Procedures,我一直在玩弄下面的代码。当单击按钮时,其想法是一个存储过程运行并使用随机数目的虚拟记录更新一个表(现在,无论如何,在我玩的时候) 我编写的存储过程使用循环添加100000行(以模拟可能需要一些时间才能运行的过程):- 问题是它似乎没有按我期望的方式工作,而且我只从存储过程向表中添加了一行 有人能告诉我为什么它不能按我所希望的那样工作吗?异步运行它不是解决方案。你必须改变超时时间。你可以调整温度。它是一个整数,表示等待响应的秒数。我通常这样设置以避免混淆: cmd.CommandTimeout =

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

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

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


有人能告诉我为什么它不能按我所希望的那样工作吗?

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

cmd.CommandTimeout = TimeSpan.FromMinutes(30).TotalSeconds;
要无限期等待,请将命令超时设置为零。我认为您还需要设置SqlConnection的ConnectionTimeout属性


另外,您应该对SqlConnection和SqlCommand对象都使用
using
模式。

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

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

您的意思是

using System.Threading.Tasks;


如果我们没有看到您正在运行的查询,那么很难确定发生了什么。。同时增加cmd.Timeout尝试减少虚拟表中的记录数,并查看是否出现相同的错误。在
ExecuteNonQueryAsync
方法上,单击
async
wait
,它将同步运行。你试过了吗?如果我减少记录的数量以便过程完成(使用ExecuteOnQuery),我一点问题都没有。我将添加存储过程。我想您可以调用ExecuteNonQueryAsync(),但在调用之后立即关闭连接。如果您发送代码的最终版本,我们可以确保。调用异步方法时,应该实现一个回调(AsyncCallback)方法,该方法将在操作完成时调用,或者获取IAsyncResult返回值,并在常规过程中检查其IsCompleted属性intervals@mat-richardson在这里是实现异步操作的最现代的方法。但是我必须同意关于超时的评论。如果存储过程将执行10分钟,则无论是同步还是异步调用存储过程,都应将超时设置为零。我不想更改超时。我将此模拟为一个测试,但最终的代码可能会使用一个存储过程,运行该过程可能需要10分钟。我真的不想让用户不得不等待。相反,我希望他们能够启动这个过程,然后继续他们的工作。但是这个命令是在连接中运行的。即使使用async,当您关闭连接时,命令也会被终止。当应用程序仍在运行时,这不是问题,请查看上的AdoNetSample。否则,您需要一些代理或服务功能来运行该进程(使用SQL代理的sp_start_作业,或处理该作业的自定义服务)。
conn.Open();
cmd.ExecuteNonQueryAsync();
conn.Close();
cmd.CommandTimeout = TimeSpan.FromMinutes(30).TotalSeconds;
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();
              })
    }