我们有一个async/await方法GetLoanDataAsync
,它通过实体框架调用存储的过程,该框架由同步方法GetData
调用。
GetLoanData
需要很长的时间来执行,这可能就是我们编写async/await的原因,它可以被多个地方使用。
我知道我们不应该混合异步和同步调用,但假设我们有这种情况并且我们正在使用 Task.Run()
从同步方法 GetData
调用异步方法 GetLoanDataAsync,我理解该方法 - GetLoanDataAsync
将在后台线程上运行。
我的问题是,如果我们有一个异步方法< code > getloandatasync 的同步版本,并使用< code>Task调用,会怎么样?从< code>GetData运行(),这种情况下会有什么不同呢?
提供有关该问题的更多详情─
我们有 ASP.NET 返回类型不是任务的 REST Web API。这是从角度应用程序调用的。这个 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。运行,直到我们将整个api设置为异步。
如果比较同步版本与异步版本,则最明显的区别是同步版本在数据库调用期间占用线程,如果所有工作都在数据库中,这似乎是不必要的。这是否是问题取决于您的吞吐量。
通过使用任务。运行
,您将允许该操作与其他工作并行运行。这很好,只要您没有任何影响线程安全或依赖于单个逻辑执行流的接触点。
如果您想有效地使用异步,最好将其视为“粘性”——即,如果X是异步的,那么所有调用X(直接或间接)的东西都需要是异步的。
我只想确保我很好地理解异步await和task.run或task.whenall之间的区别 所以异步等待就是处理异步方法。它意味着隐含着一个处理顺序。 我在不阻塞主线程的情况下运行了一个很长的处理,并等待结果继续。 对于task.run和task.when,这里有一个多线程的新概念。这意味着我可以在一个新线程上启动一个长进程,它不会等待完成来继续代码。代码在新线程上。在这个线程上,我可以等待方法。
我试图了解 Task.Run Wait() 异步等待是如何工作的。 我已经阅读了这个页面:了解在一行中使用Task.Run Wait()异步等待的使用,但不太理解它。 在我的代码中,我从Microsoft EventHub接收事件,并使用实现的类处理它们。我在 () 中调用 方法,这是一个异步方法,这是一个方法。由于该方法是的,因此我使用 和来委派。(即 或< code >。Wait()(该方法是
我有一组从基类继承的命令。基类有以下声明: 此异步方法缺少“await”运算符,将同步运行。考虑使用'await'运算符来等待非阻塞API调用,或者使用'await task.run(...)'在后台线程上执行CPU绑定的工作。 显式提供任务完成返回值是否正确?
我在网上搜索了很多关于vs await async,但是在这个特定的使用场景中,我并不真正理解其中的区别。我相信情况很简单。 vs. 其中,是一个异步方法,其中包含一些异步调用,例如使用wait调用db。 问题: 在这种情况下,两者之间有什么区别吗?任何帮助或意见,谢谢!
使用asyn/wait vs wait有什么区别task.run() 等待任务。运行示例- 异步等待示例-
问题内容: 据我了解,在ES7 /ES2016中,将多个in放在代码中的工作方式类似于带有promise的链接,这意味着它们将一个接一个地执行而不是并行执行。因此,例如,我们有以下代码: 我是否正确理解仅在完成时才会调用?并行调用它们的最优雅方式是什么? 我想在Node中使用它,所以也许有一个异步库解决方案? 编辑:我对这个问题提供的解决方案不满意:减速是由于异步生成器中非并行等待Promise的