【问题标题】:ObjectContext ExecuteFunction with async task带有异步任务的 ObjectContext ExecuteFunction
【发布时间】:2017-01-13 08:40:17
【问题描述】:

使用 Entity Framework 6 和 asp.net webapi,并使用存储过程映射, 如何将ObjectContext 执行方法转换为异步任务?

【问题讨论】:

    标签: asynchronous asp.net-web-api entity-framework-6 task


    【解决方案1】:

    作为 ExecuteFunction 的替代方案,您可以使用以下构造来为您提供异步执行:

    Task<SomeResult[]> results = ctx.Database.SqlQuery<SomeResult>("EXEC sp_myproc {0}, {1}, {2}", p1, p2, p3).ToArrayAsync();
    

    或:

    SomeResult[] results = await ctx.Database.SqlQuery<SomeResult>("EXEC sp_myproc {0}, {1}, {2}", p1, p2, p3).ToArrayAsync();
    

    如果你需要使用 ExecuteFunction 方法,你可以试试这个:

    IDbAsyncEnumerable<SomeResult> enumerable = this.ExecuteFunction<SomeResult>("sp_myproc", p1, p2, p3) as IDbAsyncEnumerable<SomeResult>;
    IDbAsyncEnumerator<SomeResult> enumerator = enumerable.GetAsyncEnumerator();
    
    while (await enumerator.MoveNextAsync(CancellationToken.None))
    {
        SomeResult res = enumerator.Current;
        ...
    }
    

    话虽如此,值得一提的是,如果您决定使用 ExecuteFunction 方法,实际的 SQL 语句将在 ExecuteFunction 行上运行,而不是在枚举结果时运行。

    【讨论】:

    • 为什么不,等待Task.Run(() => ObjectContext.ExecuteFunction ...(同步代码)?
    • 因为那是无意义的代码。开始一项新任务并等待它有什么意义?这将远远低于同步调用方法的效率。请记住,如果您想从异步编程中获得任何好处,您应该利用 I/O 完成端口 -> 它使用框架提供给您的函数的异步版本。
    • 好的,谢谢你,我现在使用 SqlQuery 来检索我的数据集存储过程,但是我如何使用这个方法在同一个存储过程中获取下一个数据集?
    • 您好 Darin,有什么建议可以异步调用没有泛型类型的 ExecuteFunction 版本吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 2017-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多