c# - 在函数内执行存储过程而不等待返回

标签 c# asp.net sql stored-procedures

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

目前这个 web 应用程序有一个问题,导致在执行某个函数时超时,我将其追溯到一件事,它正在执行一个存储过程并期望存储过程返回 # of受影响的行,这一切都很好,花花公子。但是,此存储过程至少运行了 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 方法、使用回调并且应用程序必须保持事件状态直到它完成 - 否则可能会发生回滚。是的,这是可能的 - 看看这个答案:Asynchronous call of a SQL Server stored procedure in C#

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

http://rusanu.com/2009/08/05/asynchronous-procedure-execution/

关于c# - 在函数内执行存储过程而不等待返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16697229/

相关文章:

c# - 将整数转换为字节

sql - 使用 min(datetime) 了解 SQL Server 行为

mysql - 奇怪的having和groupby子句行为生成 "Unknown column in 'having'子句“错误

mysql - SQL-使用一个元组中的值从另一个元组中获取值

Asp.Net MVC - 重载操作方法

c# - 如何生成保证唯一的 ID?

c# - 委托(delegate)变量未被垃圾收集

c# - 在代码中添加和删除数据注释

asp.net - 在已创建的 DataTable 对象上使用 SELECT DISTINCT?

javascript - jQuery 无法处理 ng-repeat 中的按钮 id