在函数中执行存储过程而不等待返回

本文关键字:等待 返回 存储过程 函数 执行 | 更新日期: 2023-09-27 18:14:46

我知道我可能在某个地方忽略了一些东西,但我正在尝试修复一个既不是我开发也通常不维护的应用程序,所以如果我犯了一个直接的错误,请提前原谅我。

目前这个web应用程序在执行某个函数时会导致超时,我已经将其追踪到一件事,它正在执行一个存储过程,并期望存储过程返回受影响的行数,这一切都很好。但是,这个存储过程至少运行50秒,并且会导致超时。此外,我不希望UI在发生这种情况时挂起50秒,它只是根据已更改的信息更新数据库中的一些状态字段,它返回的内容对最终用户没有用处,因此只需要触发并忘记它,以便用户可以继续使用应用程序。

我试过创建一个任务和创建一个线程,但由于某种原因,函数坚持等待这个任务完成。

调用存储过程的函数:

 public static void UpdateComputerStatusByApplicationID(int ApplicationID)
{
    using (SqlConnection Conn = new SqlConnection(GlobalMethods.CONNECTION_STRING))
    {
        SqlCommand Cmd = new SqlCommand("UpdateComputerStatusByApplicationId", Conn);
        Cmd.CommandType = CommandType.StoredProcedure;
        Cmd.Parameters.Add("@applicationid", SqlDbType.Int).Value = ApplicationID;
        Conn.Open();
        Cmd.ExecuteNonQuery();
        Conn.Close();
    }
}

异常来自Cmd.ExecuteNonQuery();这是一个超时异常。

这就是我从函数中调用它作为任务的地方:

public void UpdateApplication(a_Applications newApplication, XPToWin7 xpToWin7)
    {
        try
        {
            var orginalApplication = GetApplication(newApplication.AutoNumber);
            ObjectContext.ApplyCurrentValues(orginalApplication.EntityKey.EntitySetName, newApplication);
            if (xpToWin7 != null)
            {
                UnlinkXPAppWithWin7App(orginalApplication.AutoNumber);
                LinkXPAppWithWin7App(orginalApplication.AutoNumber, xpToWin7);
            }
            Task UpdateComputerStatus = Task.Factory.StartNew(() =>
            {
                DAL.UpdateComputerStatusByApplicationID(orginalApplication.AutoNumber);
            }, TaskCreationOptions.LongRunning);
            SaveChanges();
        }
        catch (Exception ex)
        {
            throw new Exception("Exception when updating the application" + ex.Message, ex);
        }
    }

我不确定我在哪里出了问题,或者为什么它不像预期的那样工作,但是当这个函数被调用时,它只是挂在UI中,直到它抛出一个内部异常,这是从cmd.ExecuteNonQuery();.

任何帮助或建议将不胜感激!

在函数中执行存储过程而不等待返回

从客户端异步调用存储过程可能是非常痛苦的—您必须考虑多个线程,BeginXXX和EndXXX方法,使用回调,并且应用程序必须保持活动状态直到它完成—否则可能会发生回滚。是的,这是可能的-看看这个答案:在c#中异步调用SQL Server存储过程

也许有一种更简单的方法——为什么不让存储过程异步呢?使用Service Broker,您可以创建一个激活存储过程的简单队列。调用存储过程不必等待响应。它只是创建一个新的会话,传递请求的详细信息并立即返回。激活的存储过程完成了所有繁重的工作,这些工作可能需要几秒钟、几分钟或几小时,但这对UI来说并不重要,因为它不会等待响应。即使UI关闭了,异步存储过程也会一直运行,直到完成。 http://rusanu.com/2009/08/05/asynchronous-procedure-execution/