如何异步运行存储过程并继续使用C#中的其他语句

时间:2017-04-19 14:06:49

标签: stored-procedures ado.net execute asynchronous

以下是我编写的代码,希望我可以异步启动存储过程并在调用运行时获取代码,以便进行必要的UI更改。 但这只适用于我从视觉工作室运行时,当我提出断点时。我删除断点时,它不会在以下行之后运行代码: -

  

IAsyncResult result = command.BeginExecuteNonQuery();

但是,我只是假设它没有运行,但我不确定,因为我不知道如何正确地知道它是否正在运行,只取决于输出我能够说出来。按钮隐藏或可见性逻辑不起作用。

我想,因为上面的语句是异步的,我可以按需要实现执行。

我提到以下内容来实现此代码: - BeginExecuteNonQuery without EndExecuteNonQuery

 protected void Button1_Click(object sender, EventArgs e)
 {

    using (SqlConnection conn = new SqlConnection(sqlConnectionString))
    {
        try
        {
            SqlCommand command = new SqlCommand();
            command.Connection = conn;
            command.CommandType = CommandType.StoredProcedure;
            command.CommandTimeout = Convert.ToInt32(System.Configuration.ConfigurationManager.AppSettings["SqlCommandTimeOut"]);
            command.CommandText = "RunPackage";
            command.Parameters.Add(new SqlParameter("@UserID", SqlDbType.Int));
            command.Parameters["@UserID"].Value = SessionVariables.UserID;
            command.Parameters.Add(new SqlParameter("@JobName", SqlDbType.NVarChar));
            command.Parameters["@JobName"].Value = System.Configuration.ConfigurationManager.AppSettings["JobName"].ToString();
            conn.Open();

            IAsyncResult result = command.BeginExecuteNonQuery();
            bool boolresult = GetCurrentRunningJob();

            if (boolresult == true)
            {
                Button1.Enabled = false;
                Button1.Visible = false;
                Button2.Visible = true;
                Button2.Enabled = true;
                lblPackageStatus.Text = "The job is already running. Please wait to re-run.";
                lblPackageStatus.ForeColor = System.Drawing.Color.Red;
            }
            else
            {
                Button2.Enabled = false;
                Button2.Visible = false;
                Button1.Visible = true;
                Button1.Enabled = true;
                lblPackageStatus.Text = "";
            }
            command.EndExecuteNonQuery(result);
        }
        catch (Exception err)
        {
            Elmah.ErrorLog.GetDefault(HttpContext.Current).Log(new Elmah.Error(ex));
        }
    }

}

1 个答案:

答案 0 :(得分:0)

您似乎正在检查查询是否通过调用自定义方法GetCurrentRunningJob来完成。

如果是这种情况,则不需要这样做。相反,如果操作完成,您可以查看结果上的IsCompleted属性 - true ;否则, false

IAsyncResult result = command.BeginExecuteNonQuery();

while (!result.IsCompleted)
{
   // your code
}

command.EndExecuteNonQuery(result);