当前位置: 首页 > 知识库问答 >
问题:

任务(异步,等待):我需要输入这些都是连接层或只有那些与ASYNC调用,即HttpClient。同步?

屠德宇
2023-03-14

我遇到了一个小问题,我写了一个asp。NETWebAPI服务和我在控制器上自动添加了“async”,当然这现在需要我使用wait。

我的问题是,我的控制器连接到一个服务层,然后这个服务层连接到一个数据层-这个数据层是调用异步版本的GET以对另一个REST服务进行异步调用的层-因此这很容易,我可以将我的数据层方法转换为“异步”关键字,我将在HttpClient GetSync调用上放置一个wait。

但是我的服务层要支持async/await,我需要将返回类型更改为Task,但是服务层实际上没有做任何异步操作,它调用的数据层实际上正在调用HttpClient异步方法。

所以我有2个选项,考虑到我有下面的层结构。

ASP。NETWebAPI

仅在数据层中使用async和await,然后使用它。

或者将async和wait放在服务层的控制器和方法上,这需要重构,因为我需要返回任务。

我想在我没有完全理解它的地方,技术上唯一的阻塞调用将在数据层中,所以要让所有线程返回线程池以供使用,我应该只关心在数据层上放置async和Wait?

我什么时候需要在控制器上使用模式???

期待任何帮助

共有2个答案

谯英彦
2023-03-14

如果您的调用线程没有任何有意义的事情要做,那么创建一个单独的任务来为您完成这项工作是没有好处的。

但是,如果调用线程还有其他事情要做,例如保持UI响应,那么调用线程可能希望在单独的任务中调用您的函数,执行其他事情,并在需要结果时等待结果。

示例:

private async YourAsyncWebFunction(...)
{
    // do some processing
    // call other async functions ans wait for it to finish:
    await OtherAsync(...);
    var result = await OtherAsync2(...)
    if (result == ...) { ... }
}

private void MyMainFunction(...)
{
    var taskWebFunction = Task.Run( () => YourAsyncWebFunction(...));
    // do other things
    // after a while: you need the task to finish:
    await taskWebFunction;
    // do other things
 }

如果您的主函数是一个事件处理程序,则不必执行此任务。运行时,只需将事件处理程序声明为异步

事件处理程序是唯一可以返回void而不是Task或Task

private async void OnButton1_Clicked(object sender, ...)
{
     // do some processing
     await YourAsyncWebFunction(...)
}

袁运良
2023-03-14

我在控制器上自动添加了“async”,当然现在需要使用wait。

这是倒退。如果需要使用wait,则只应向方法添加async

仅在数据层中使用async和await,然后使用它。

您不应该在同步API中包装异步方法。在服务器代码中尤其如此,因为这样您就失去了async的所有好处。

或者将async和wait放在服务层的控制器和方法上,这需要重构,因为我需要返回任务。

这是正确的做法。遵循以下准则:

  1. 不要阻塞async代码。例如,不要调用任务。等待任务

您可能会发现我关于异步编程最佳实践的文章很有帮助。

 类似资料:
  • 然后我有了调用webAPI的dataLayer,它看起来像这样。为了简单起见,我直接使用。result。 我的问题是,我看到一些教程说我们应该避免使用。result,因为它可能会导致死锁。我不确定在我的情况下是否需要使用Async/await?如果我确实需要,我知道我应该一直异步,但我确实希望我的controlLayer是同步的,因为我有其他层调用controlLayer的函数,我不希望所有层的函

  • 我有一组从基类继承的命令。基类有以下声明: 此异步方法缺少“await”运算符,将同步运行。考虑使用'await'运算符来等待非阻塞API调用,或者使用'await task.run(...)'在后台线程上执行CPU绑定的工作。 显式提供任务完成返回值是否正确?

  • 问题内容: 我想删除一些mongodb集合,但这是一个异步任务。代码将是: 控制台显示: 确保删除所有收藏集后将被打印的最简单方法是什么?任何第三方都可以用来简化代码。 问题答案: 我看到您正在使用,因此您正在谈论服务器端JavaScript。在这种情况下,我建议您查看异步模块并使用。您会发现此模块确实有用-它是为解决您所遇到的问题而开发的。您的代码可能如下所示

  • 我们有一个async/await方法,它通过实体框架调用存储的过程,该框架由同步方法调用。 需要很长的时间来执行,这可能就是我们编写async/await的原因,它可以被多个地方使用。 我知道我们不应该混合异步和同步调用,但假设我们有这种情况并且我们正在使用 从同步方法 调用异步方法 GetLoanDataAsync,我理解该方法 - 将在后台线程上运行。 我的问题是,如果我们有一个异步方法< c

  • 问题内容: 我想同时下载一些文件,例如100个文件。因此,我决定将下载线程添加到调度队列中,GCD会调整同时运行多少个线程。 这里的问题是:中的块将立即完成,因为它将在另一个线程上运行。因此,如果长度为100,它将立即创建100个线程。 如何配置块以等待下载任务完成?我不想使用,因为它只允许同时运行一个下载任务。 问题答案: 要扩展Abhinav的答案,您应该: 使用创建一个组。 在开始每个下载任

  • 如果我有这个功能 然后投入140000000,那么这将需要一秒钟来完成。如果我需要返回的值来继续一个函数的其余部分,我想我需要等待响应,这样我就可以使用响应了 但事实上,我认为它与其说是一个值,我需要传递到下一个函数中,让它工作,所以它基本上没有等待响应,因为它基本上发送一个函数作为参数,如 所以,也许我在这里花了很多时间,但基本上,我如何实现同步编程,什么不适合速度,什么是正确使用异步和prom