以下是我编写的代码,希望我可以异步启动存储过程并在调用运行时获取代码,以便进行必要的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));
}
}
}
答案 0 :(得分:0)
您似乎正在检查查询是否通过调用自定义方法GetCurrentRunningJob
来完成。
如果是这种情况,则不需要这样做。相反,如果操作完成,您可以查看结果上的IsCompleted属性 - true ;否则, false 。
IAsyncResult result = command.BeginExecuteNonQuery();
while (!result.IsCompleted)
{
// your code
}
command.EndExecuteNonQuery(result);