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

为所有服务器端代码调用ConfigureAit的最佳实践

耿星雨
2023-03-14

当您有服务器端代码(即一些apicontroller)并且您的函数是异步的--因此它们返回task --在等待函数时调用configureawait(false)是否被认为是最佳做法?

我读到它的性能更好,因为它不需要将线程上下文切换回原来的线程上下文。但是,使用ASP.NET Web Api,如果请求是在一个线程上传入的,并且您等待某个函数并调用configureawait(false),当您返回apicontroller函数的最终结果时,该函数可能会将您置于另一个线程上。

我在下面打了一个例子来说明我所说的:

public class CustomerController : ApiController
{
    public async Task<Customer> Get(int id)
    {
        // you are on a particular thread here
        var customer = await GetCustomerAsync(id).ConfigureAwait(false);
        
        // now you are on a different thread!  will that cause problems?
        return customer;
    }
}

共有1个答案

冯峻
2023-03-14

更新:ASP.NET核心没有synchronizationContext。如果您在ASP.NET核心上,则是否使用configureaitait(false)并不重要。

对于ASP.NET“完整的”或“经典的”或其他什么,这个答案的其余部分仍然适用。

原始文章(用于非核心ASP.NET):

ASP.NET团队的这段视频提供了关于在ASP.NET上使用async的最佳信息。

我读到它的性能更好,因为它不需要将线程上下文切换回原来的线程上下文。

UI应用程序也是如此,其中只有一个UI线程需要“同步”回。

在ASP.NET中,情况要复杂一些。当async方法恢复执行时,它会从ASP.NET线程池中抓取一个线程。如果使用configureawait(false)禁用上下文捕获,则线程只是继续直接执行该方法。如果不禁用上下文捕获,那么线程将重新进入请求上下文,然后继续执行该方法。

因此configureawait(false)不会在ASP.NET中为您保存线程跳转;它确实节省了重新输入请求上下文的时间,但这通常是非常快的。configureawait(false)在尝试对请求进行少量并行处理时可能很有用,但实际上TPL更适合大多数这种情况。

但是,对于ASP.NET Web Api,如果请求是在一个线程上传入的,并且您正在等待某个函数和调用ConfigureAit(false),当您返回ApiController函数的最终结果时,它可能会将您置于另一个线程上。

实际上,只需执行await就可以做到这一点。一旦async方法命中await,该方法将被阻塞,但线程将返回线程池。当方法准备好继续时,将从线程池中提取任何线程并用于恢复该方法。

configureawait在ASP.NET中的唯一区别是在恢复方法时该线程是否进入请求上下文。

我在关于synchronizationcontext的MSDN文章和async介绍博文中有更多的背景信息。

 类似资料:
  • 问题内容: 我想使用socket.io将数据从服务器推送到浏览器,但是该项目是java tomcat之一,并且 Github中 有许多实现的服务器实现。他们中的大多数人都说 过时了, 或者有更好的版本可用。谁能建议我一个好的实现。 而且,我看到了许多有关使用广播的演示和示例代码。我的要求是将不同的消息推送到不同的客户端。有人可以指出一些有关此类内容的优秀演示或教程吗? 谢谢 问题答案: 作为作者,

  • 我正在开发一个Flutter应用程序,但想知道在从UI调用异步代码时应该做什么--比方说UI小部件的构建方法。 例如,我的应用程序通过一个服务类连接Firebase,该服务类使用Async-Await样式从Firebase获取记录。使用await可以确保我的服务类的方法在返回UI端之前完成记录检索。 吉米

  • 问题内容: 我想创建具有低负载的简单服务器。目标是使一些javascript客户端可以通过WebSocket访问以Java实现的某些功能。我正在寻找最佳的库来使用- 它应该简单,健壮等。现在我考虑3个替代方案-jWebSocket-jetty-netty最好的是什么?还是其他呢? 提前致谢 问题答案: jWebSocket现在包括Jetty8.0引擎,该引擎包括SSL,并且在其之上还包括许多功能。

  • ComplexTypeService是一个WebService类,该类的代码如下: import java.io.FileOutputStream; import data.DataForm; public class ComplexTypeService{ //  上传图像,imageByte参数表示上传图像文件的字节, //  length参数表示图像文件的字节长度(该参数

  • 分包 建议将服务接口、服务模型、服务异常等均放在 API 包中,因为服务模型和异常也是 API 的一部分,这样做也符合分包原则:重用发布等价原则(REP),共同重用原则(CRP)。 如果需要,也可以考虑在 API 包中放置一份 Spring 的引用配置,这样使用方只需在 Spring 加载过程中引用此配置即可。配置建议放在模块的包目录下,以免冲突,如:com/alibaba/china/xxx/d

  • 本文向大家介绍Android连接服务器端的Socket的实例代码,包括了Android连接服务器端的Socket的实例代码的使用技巧和注意事项,需要的朋友参考一下 废话不多说了,直接给大家贴代码了,具体代码如下所述: package com.exa 以上所述是小编给大家介绍的Android连接服务器端的Socket的实例代码,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的