繁体   English   中英

用于 DB 调用的带有 Task.Run 方法的异步等待

[英]Async Await with Task.Run method for DB call

我们有一个异步/等待方法GetLoanDataAsync ,它通过实体框架调用存储过程,该实体框架由同步方法GetData调用。

GetLoanData需要大量时间来执行,这可能是我们编写为 async/await 的原因,它可以被多个地方使用。

我知道我们不应该混合使用异步和同步调用,但是假设我们有这种情况并且我们正在使用Task.Run()从同步方法GetData调用异步方法GetLoanDataAsync ,我理解该方法 - GetLoanDataAsync将在后台运行线。

我的问题是,如果我们有一个同步版本的异步方法GetLoanDataAsync并使用GetData中的Task.Run()调用,那么在这种情况下会有什么不同呢?

提供有关该问题的更多详细信息-

我们有 ASP.NET REST Web ZDB974238714CA8DE634A7CE1D083A14F 返回类型不是任务。 这是从 angular 应用程序调用的。 这个 api 有几个称为 GetData() 的方法,我们在其中等待GetLoanDataAsync的结果。 根据我的理解GetLoanDataAsync将在后台线程中调用,并且能够执行GetUserDetails() ,一旦完成,它将返回执行GetLoanDataAsync的结果。

代码 -

public List<int> GetData(int id)
{

    // Calls GetLoanDataAsync

    var result = Task.Run(()=> GetLoanDataAsync(id));

    // calls couple other sync methods

    GetUserDetails(); 

    return result.GetAwaiter().GetResult();

}

GetLoanDataAsync().Result将导致死锁,这是较早的问题。 为了解决这个问题,我们暂时尝试使用 Task.Run 直到我们将整体 api 作为异步。

如果您比较同步版本与异步版本,那么最明显的区别是同步版本在 DB 调用期间占用了一个线程,如果所有工作都在数据库中,这似乎是不必要的。 这是否是一个问题取决于您的吞吐量。

通过使用Task.Run ,您允许该操作与其他工作并行运行。 这很好,只要您没有任何影响线程安全或依赖于单个逻辑执行流的接触点。

如果你想有效地使用异步,最好认为它是“粘性的”——即如果 X 是异步的,那么所有调用 X(直接或间接)的东西都需要是异步的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM