如何异步调用存储过程?

时间:2017-06-29 06:23:55

标签: c# asp.net-mvc entity-framework asynchronous

在我的 ASP.NET MVC(C#)应用程序中,我正在使用实体框架并调用这样的存储过程:

    public virtual ObjectResult<ART_USP_GetAssetReportGridList_Result> ART_USP_GetAssetReportGridList(string searchExpression, string sortExpression, string sortDirection, Nullable<int> startIndex, Nullable<int> pageSize, ObjectParameter count)
    {
        var searchExpressionParameter = searchExpression != null ?
            new ObjectParameter("SearchExpression", searchExpression) :
            new ObjectParameter("SearchExpression", typeof(string));

        var sortExpressionParameter = sortExpression != null ?
            new ObjectParameter("SortExpression", sortExpression) :
            new ObjectParameter("SortExpression", typeof(string));

        var sortDirectionParameter = sortDirection != null ?
            new ObjectParameter("SortDirection", sortDirection) :
            new ObjectParameter("SortDirection", typeof(string));

        var startIndexParameter = startIndex.HasValue ?
            new ObjectParameter("StartIndex", startIndex) :
            new ObjectParameter("StartIndex", typeof(int));

        var pageSizeParameter = pageSize.HasValue ?
            new ObjectParameter("PageSize", pageSize) :
            new ObjectParameter("PageSize", typeof(int));

        return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<ART_USP_GetAssetReportGridList_Result>("ART_USP_GetAssetReportGridList", searchExpressionParameter, sortExpressionParameter, sortDirectionParameter, startIndexParameter, pageSizeParameter, count);
    }

此处 ART_USP_GetAssetReportGridList 是存储过程名称。这是同步通话。如果记录数超过3000,则此调用会给出超时错误。

如何在不收到超时错误的情况下异步进行此调用?

3 个答案:

答案 0 :(得分:0)

将此异步调用不会有任何区别。您收到命令超时错误。我要避免这种情况,你应该增加SQL连接的CommandTimeout设置。但我非常建议不要这样做,并查看你的存储过程效率 - 30秒默认超时应该是方式,比你需要的方式更多。

答案 1 :(得分:0)

您可以按如下方式增加特定操作的超时时间。

 <div className='row'>
         <div>row1</div><div>row2</div><div>row3</div>
     </div>

或者在DbContext构造函数上设置此代码。

答案 2 :(得分:0)

请试试这个

 var data = ObjectContext.Database.SqlQuery<ART_USP_GetAssetReportGridList_Result>("ART_USP_GetAssetReportGridList", searchExpressionParameter, sortExpressionParameter, sortDirectionParameter, startIndexParameter, pageSizeParameter, count).FirstOrDefaultAsync();