如何在 Startup.Configure 中处理异步操作?

2024-03-16

在我的 ASP.NET 5 应用程序中,我想将一些数据从 Azure 加载到 Startup.Configure 方法内的缓存中。 Azure SDK 专门公开异步方法。通常,调用异步方法是通过异步方法内的等待完成的,如下所示:

public async Task Configure(IApplicationBuilder app, IMemoryCache cache)
{
    Data dataToCache = await DataSource.LoadDataAsync();
    cache.Set("somekey", dataToCache);

    // remainder of Configure method omitted for clarity
}

但是,ASP.NET 5 要求Configure 方法返回void。我可以使用 async void 方法,但我的理解是 async void 方法只应该用于事件处理程序(根据https://msdn.microsoft.com/en-us/magazine/jj991977.aspx https://msdn.microsoft.com/en-us/magazine/jj991977.aspx等等)。

我认为更好的方法是调用异步函数而不等待,对返回的任务调用 Wait,然后通过 Task.Results 属性缓存结果,如下所示:

public void Configure(IApplicationBuilder app, IMemoryCache cache)
{
    Task<Data> loadDataTask = DataSource.LoadDataAsync();
    loadDataTask.Wait();
    cache.Set("somekey", loadDataTask.Result);

    // remainder of Configure method omitted for clarity
}

斯蒂芬·瓦尔特 (Stephen Walther) 在博客文章 http://stephenwalther.com/archive/2015/01/29/asp-net-5-and-angularjs-part-6-security今年早些时候。然而,从该帖子中尚不清楚这是否被认为是可接受的做法。是吗?

如果这被认为是可接受的做法,那么我需要什么(如果有的话)错误处理?我的理解是 Task.Wait() 将重新抛出异步操作引发的任何异常,并且我没有提供任何机制来取消异步操作。简单地调用 Task.Wait() 就足够了吗?


您链接到的博客中的示例代码仅使用异步同步来使用示例数据填充数据库;该调用不会存在于生产应用程序中。

首先,我想说如果你真的需要Configure如果是异步的,那么您应该向 ASP.NET 团队提出问题,以便他们注意到这一点。对他们来说,增加对ConfigureAsync此时(即发布之前)。

其次,您有几种解决问题的方法。你could use task.Wait(或者更好的是,task.GetAwaiter().GetResult(),这避免了AggregateException如果确实发生错误则包装器)。或者,您可以缓存task而不是result任务的(如果IMemoryCache更像是一本字典,而不是一些奇怪的序列化到内存中的二进制数组的东西 - 我正在看你,以前版本的 ASP.NET)。

如果这被认为是可接受的做法,那么我需要什么(如果有的话)错误处理?

Using GetAwaiter().GetResult()会导致异常(如果有的话)传播出去Configure。我不确定 ASP.NET 将如何响应配置但申请失败了。

我没有提供任何机制来取消异步操作。

我不确定如何“取消”设置应用,所以我不会担心这一部分。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Startup.Configure 中处理异步操作? 的相关文章

  • Web 客户端和 Expect100Continue

    使用 WebClient C NET 时设置 Expect100Continue 的最佳方法是什么 我有下面的代码 我仍然在标题中看到 100 continue 愚蠢的 apache 仍然抱怨 505 错误 string url http
  • 为什么两个不同的 Base64 字符串的转换会返回相等的字节数组?

    我想知道为什么从 base64 字符串转换会为不同的字符串返回相同的字节数组 const string s1 dg const string s2 dq byte a1 Convert FromBase64String s1 byte a2
  • 不支持将数据直接绑定到存储查询(DbSet、DbQuery、DbSqlQuery)

    正在编码视觉工作室2012并使用实体模型作为我的数据层 但是 当页面尝试加载时 上面提到的标题 我使用 Linq 语句的下拉控件往往会引发未处理的异常 下面是我的代码 using AdventureWorksEntities dw new
  • 从Web API同步调用外部api

    我需要从我的 Web API 2 控制器调用外部 api 类似于此处的要求 使用 HttpClient 从 Web API 操作调用外部 HTTP 服务 https stackoverflow com questions 13222998
  • BitTorrent 追踪器宣布问题

    我花了一点业余时间编写 BitTorrent 客户端 主要是出于好奇 但部分是出于提高我的 C 技能的愿望 我一直在使用理论维基 http wiki theory org BitTorrentSpecification作为我的向导 我已经建
  • 堆栈溢出:堆栈空间中重复的临时分配?

    struct MemBlock char mem 1024 MemBlock operator const MemBlock b const return MemBlock global void foo int step 0 if ste
  • 重载<<的返回值

    include
  • 转发声明和包含

    在使用库时 无论是我自己的还是外部的 都有很多带有前向声明的类 根据情况 相同的类也包含在内 当我使用某个类时 我需要知道该类使用的某些对象是前向声明的还是 include d 原因是我想知道是否应该包含两个标题还是只包含一个标题 现在我知
  • 如何序列化/反序列化自定义数据集

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • 这些作业之间是否存在顺序点?

    以下代码中的两个赋值之间是否存在序列点 f f x 1 1 x 2 不 没有 在这种情况下 标准确实是含糊不清的 如果你想确认这一点 gcc 有这个非常酷的选项 Wsequence point在这种情况下 它会警告您该操作可能未定义
  • Windows 窗体:如果文本太长,请添加新行到标签

    我正在使用 C 有时 从网络服务返回的文本 我在标签中显示 太长 并且会在表单边缘被截断 如果标签不适合表单 是否有一种简单的方法可以在标签中添加换行符 Thanks 如果您将标签设置为autosize 它会随着您输入的任何文本自动增长 为
  • WPF/C# 将自定义对象列表数据绑定到列表框?

    我在将自定义对象列表的数据绑定到ListBox in WPF 这是自定义对象 public class FileItem public string Name get set public string Path get set 这是列表
  • 向现有 TCP 和 UDP 代码添加 SSL 支持?

    这是我的问题 现在我有一个 Linux 服务器应用程序 使用 C gcc 编写 它与 Windows C 客户端应用程序 Visual Studio 9 Qt 4 5 进行通信 是什么very在不完全破坏现有协议的情况下向双方添加 SSL
  • cmake 将标头包含到每个源文件中

    其实我有一个简单的问题 但找不到答案 也许你可以给我指一个副本 所以 问题是 是否可以告诉 cmake 指示编译器在每个源文件的开头自动包含一些头文件 这样就不需要放置 include foo h 了 谢谢 CMake 没有针对此特定用例的
  • 如何将带有 IP 地址的连接字符串放入 web.config 文件中?

    我们当前在 web config 文件中使用以下连接字符串 add name DBConnectionString connectionString Data Source ourServer Initial Catalog ourDB P
  • 混合 ExecutionContext.SuppressFlow 和任务时 AsyncLocal.Value 出现意外值

    在应用程序中 由于 AsyncLocal 的错误 意外值 我遇到了奇怪的行为 尽管我抑制了执行上下文的流程 但 AsyncLocal Value 属性有时不会在新生成的任务的执行范围内重置 下面我创建了一个最小的可重现示例来演示该问题 pr
  • Windows 和 Linux 上的线程

    我在互联网上看到过在 Windows 上使用 C 制作多线程应用程序的教程 以及在 Linux 上执行相同操作的其他教程 但不能同时用于两者 是否存在即使在 Linux 或 Windows 上编译也能工作的函数 您需要使用一个包含两者的实现
  • C++ 中类级 new 删除运算符的线程安全

    我在我的一门课程中重新实现了新 删除运算符 现在我正在使我的代码成为多线程 并想了解这些运算符是否也需要线程安全 我在某处读到 Visual Studio 中默认的 new delete 运算符是线程安全的 但这对于我的类的自定义 new
  • 如何防止用户控件表单在 C# 中处理键盘输入(箭头键)

    我的用户控件包含其他可以选择的控件 我想实现使用箭头键导航子控件的方法 问题是家长控制拦截箭头键并使用它来滚动其视图什么是我想避免的事情 我想自己解决控制内容的导航问题 我如何控制由箭头键引起的标准行为 提前致谢 MTH 这通常是通过重写
  • 对来自流读取器的过滤数据执行小计

    编辑问题未得到解答 我有一个基于 1 个标准的过滤输出 前 3 个数字是 110 210 或 310 给出 3 个不同的组 从流阅读器控制台 问题已编辑 因为第一个答案是我给出的具体示例的字面解决方案 我使用的实际字符串长度为 450 个

随机推荐

  • 声纳:“关闭这个PreparedStatement”

    Why is 声纳Qube http docs sonarqube org 如果我在finally块中关闭它 Jenkins的插件会抱怨打开的语句 我需要在单独的函数中验证数据库连接 final String PING SELECT 1 f
  • Hamcrest Matchers 包含匹配器列表

    我正在尝试使用org hamcrest Matchers contains java util List gt http hamcrest org JavaHamcrest javadoc 1 3 org hamcrest Matchers
  • 以编程方式将 UILabels 和 UIImageViews 添加到 UIScrollView

    我知道这个问题在这里经常出现 但我似乎仍然无法让它发挥作用 我可能没有正确启动视图或其他 无论如何 我正在尝试以编程方式向 UIScrollView 添加多个标签和图像 这是我的 h 文件的代码 import
  • ggplot2 中缺少功能区

    我似乎在 ggplot2 中设置功能区显示时遇到问题 这是一个组成的数据集 Estimate lt c 100 125 150 175 GlobalDFData lt data frame Estimate Upper Estimate 2
  • JavaScript 大括号参数作为函数参数[重复]

    这个问题在这里已经有答案了 我对 javascript 不太熟悉 并且有一个关于函数参数周围使用大括号的问题 因为它不是 JSON 结构 我正在学习核js 我找到了一些代码作为示例 但我不太明白 为什么 产品 在大括号中 addToCart
  • 串行执行单元测试(而不是并行)

    我正在尝试对我编写的 WCF 主机管理引擎进行单元测试 该引擎基本上根据配置动态创建 ServiceHost 实例 这使我们能够动态地重新配置哪些服务可用 而无需在添加新服务或删除旧服务时关闭所有服务并重新启动它们 然而 由于 Servic
  • GCC Linker:如何在输出部分生成每个文件贡献的报告

    最近我在尝试链接我的程序时遇到了一个问题 它报告 text无法放入指定的内存区域 显然 源代码变得太大而无法在有限的内存区域中链接 我现在要做的是分析哪个文件对 text 部分贡献最大 以便进行后续代码优化 我尝试了很多方法但没有成功 nm
  • 飞镖向下转型

    我需要在 dart 中进行向下转换 例如可以从Object to int 但我无法用我自己的课程来做到这一点 难道我做错了什么 或者正确的方法是怎样做的 class Person final String name final int ag
  • 我如何模拟 JodaTime 实际日期?

    我想测试一下这个方法 public FirmOrder findActiveByModelColor ModelColor modelColor Query query em createQuery FROM FirmOrder fo WH
  • 将 bootstrap select2 与 JqGrid 表单一起使用

    我正在尝试使用 jqgrid 形式实现 bootstrap select2 但似乎可以正确执行 在 jqgrid 声明的 colmodel 上我有 name staff index staff width 31 formoptions el
  • SoapUI 更改端点地址

    我想更改端点地址 但它给了我定义的值 我的意思是 只有一个值 我尝试在那里写 但它不起作用 它不可编辑 我怎样才能改变它 查看请求窗口并展开包含端点地址的选择框 你应该看到这样的东西 edit current add new endpoin
  • xml 模式中是否有任何方法可以让 xml 元素中的属性始终大于另一个属性?

    这里是xml
  • 发送器停止后让接收器继续运行

    我正在使用一个基于 Google 的简单接收器CastHelloText 示例应用程序 https github com googlecast CastHelloText chrome 当发送者断开连接时 我想允许接收者继续显示 我认为这可
  • Python 网络服务

    我正在做类似于 Ubuntu Landscape 的服务器 客户端应用程序 http www canonical com enterprise services ubuntu advantage landscape http www can
  • 如何在 XML 中表示列表数据

    我正在为我当前的用例设计 XML 文档 我的用例是 给定一个 id 我可以获得检查分数 天赋分数和类别数量 每个类别都会有类别ID 检查分数和天赋分数 所以假设如果我有两个 id 那么上面的数据将存在于两个 id 中 例如 下面是我基于单个
  • 在 Neo4J Cypher 2.0 中创建多个节点/边时发出一个 MERGE 请求更好,还是将其拆分为事务更好?

    我有一个很长的 Cypher 查询 新的 Neo4J 2 0 版本 它使用 MERGE 命令创建多个节点和连接 问题是 您认为我最好将其分成不同的部分并将其作为交易提交 为了稳健性 还是应该保留长的单个交易 为了速度 这是查询 MATCH
  • 将逗号(,)放在数组末尾。这是约定吗?

    有时我会看到如下所示的数组 array item1 gt array subitem1 subitem2 为什么数组末尾添加了逗号 而submit m2后没有元素 它使得稍后添加另一个条目变得更加容易
  • Android 圆形复选标记动画

    我正在尝试实现类似的目标BEM动画类型描边可以在 iOS 库中找到BEM复选框 https github com Boris Em BEMCheckBox 我尝试使用动画矢量可绘制对象来实现此目的 但我不知道如何对圆内的复选标记进行动画处理
  • x86 asm:如何将 reg 设置为非 SIB 支持的偏移量?

    我有一个数组a24 字节结构体 排列无填充 以便结构体 1 在结构体 0 之后 24 个字节处开始 void a 1 void a 0 24 rbx保存结构体的索引 我想设置rdi to a rbx 24 and rsi to a rbx
  • 如何在 Startup.Configure 中处理异步操作?

    在我的 ASP NET 5 应用程序中 我想将一些数据从 Azure 加载到 Startup Configure 方法内的缓存中 Azure SDK 专门公开异步方法 通常 调用异步方法是通过异步方法内的等待完成的 如下所示 public