Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在函数中执行存储过程而不等待返回_C#_Asp.net_Sql_Stored Procedures - Fatal编程技术网

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

C# 在函数中执行存储过程而不等待返回,c#,asp.net,sql,stored-procedures,C#,Asp.net,Sql,Stored Procedures,我知道在某些地方我可能忽略了一些东西,但我正在尝试修复一个我没有开发并且通常不维护的应用程序,所以如果我犯了一个直截了当的错误,请提前原谅我 目前,这个web应用程序存在一个问题,在执行某个函数时导致超时,我将其归结为一件事,它执行一个存储过程,并希望存储过程返回受影响的行数,这一切都很好。但是,此存储过程至少运行50秒,并导致超时。此外,我不希望UI在发生这种情况时挂起50秒,它只是根据更改的信息更新数据库中的一些状态字段,它返回的内容对最终用户没有用处,因此只需要触发并忘记它,以便用户可以继

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

目前,这个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()的内部异常


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

< P>从客户端异步调用存储过程可能是一种巨大的痛苦——必须考虑多线程、RealXXX和EntXXX方法,使用回调,应用程序必须保持活动状态,直到完成为止,否则可能会发生回滚。是的,这是可能的-看看这个答案:

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


开始将
cmd.CommandTimeout
属性更改为更长的值,默认值为30秒。这应该可以解决超时异常,尽管UI挂起50秒对于存储过程来说是很长的时间-您可以发布存储过程吗,可能它使用了可以删除的光标,或者可能缺少索引。此外,UI问题可以通过在不同线程上进行UI和数据操作来解决。考虑使用<代码>后台工作程序< /代码>并异步调用您的更新方法。是否使用SQLServer?是否尝试在应用程序外运行该程序以查看是否还需要50秒完成?嘿,克里斯,所以我已经尝试了两个选项,包括从存储过程调用作业,这让我更进一步,因为UI不再挂起,但一旦引入多个用户,就会出现错误,因为作业无法在多个实例中运行。我认为服务代理就是解决这个问题的方法,我想知道你是否可以给我举一个类似的方法的例子?我不熟悉使用Service Broker,因为我主要在SharePoint领域工作,但最近开始为我们的应用程序团队做一些工作。@BAllan-添加了一个指向我答案的链接。