如何在此父方法中等待异步方法而不使用异步修饰符?

2024-01-06

我有一个想要等待的方法,但我不想引起多米诺骨牌效应,认为任何东西都可以调用这个调用方法并等待它。例如我有这样的方法:

public bool Save(string data)
{
   int rowsAffected = await UpdateDataAsync(data);
   return rowsAffected > 0;
}

我打电话:

public Task<int> UpdateDataAsync()
{
  return Task.Run(() =>
  {
    return Data.Update(); //return an integer of rowsAffected
  }
}

这不起作用,因为我必须在方法签名中添加“async”Save()然后我就回不去了bool我必须做到Task<bool>但我不想让任何人等待Save() method.

有没有办法可以像await一样暂停代码执行,或者以某种方式在没有async修饰符的情况下等待此代码?


如何在此父方法中等待异步方法而不使用异步修饰符?

这有点像问“如何使用 C# 编写应用程序而不依赖于任何类型的 .NET 运行时?”

简短的回答:不要这样做。

实际上,您在这里所做的是采用自然同步方法(Update),通过在线程池线程上运行它使其看起来异步(UpdateDataAsync),然后您想要阻止它以使异步方法看起来同步(Save)。严重的危险信号。

我建议您仔细研究 Stephen Toub 的两篇著名博客文章我应该为我的同步方法公开异步包装器吗 https://devblogs.microsoft.com/pfxteam/should-i-expose-asynchronous-wrappers-for-synchronous-methods/ and 我应该为我的异步方法公开同步包装器吗 https://devblogs.microsoft.com/pfxteam/should-i-expose-synchronous-wrappers-for-asynchronous-methods/。这两个问题的答案都是“否”,尽管 Stephen Toub 解释了几种在确实需要时可以这样做的选择。

“确实必须”应该保留给应用程序级别。我假设这些方法(Update, UpdateDataAsync, and Save)位于应用程序的不同层(例如,数据/数据服务/视图模型)。数据/数据服务层不应进行同步/异步转换。视图模型(特定于应用程序的)级别是唯一有理由进行这种转换的级别——并且它应该只作为最后的手段这样做。

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

如何在此父方法中等待异步方法而不使用异步修饰符? 的相关文章

随机推荐

  • 之间的间隙
  • 为了避免长列表 我将 li 设置为 float left 以便它们交替行 然而 有时当 li 中的内容占据两行时 这会导致元素之间出现无意的间隙 我的 HTML 是 ul class gmc ingredient list li 500g
  • didUpdateLocations 而不是 didUpdateToLocation

    随着 iOS6 的发布 Apple 希望我们使用 didUpdateLocations 而不是 didUpdateToLocation 谁能解释如何正确使用 didUpdateLocations 我假设您使用以下代表来获得最后一个位置 vo
  • 与 Java 7 兼容的旧项目

    我的旧项目使用Java 6 1 6 我不知道当我更新 Java 7 时 它们可以正常运行吗 有一个官方名单 http www oracle com technetwork java javase compatibility 417013 h
  • 从 IOwinContext 获取路由模板

    我希望从请求中获取路线模板 我正在使用 Owin 中间件 并重写接受 IOwinContext 的 Invoke 方法 public override async Task Invoke IOwinContext context 给定请求
  • 在 php.ini 中设置默认欧洲时区,但 date_default_timezone_get() 返回 'UTC'

    我已经设置了php ini文件默认时区 date timezone Europe Rome 我也重启了httpd编辑后的服务 服务httpd重新启动 但是当我打电话时date default timezone get 它返回 UTC 值 为
  • 大内存块未被垃圾收集

    在寻找应用程序中的内存泄漏时 我追查了一个我无法理解的行为 我分配了一个大内存块 但它不会被垃圾收集 从而导致 OOM 除非我在 onDestroy 中显式将引用设为 null 在此示例中 我有两个几乎相同的活动 它们相互切换 两者都有一个
  • 时间:2019-03-17 标签:c#datagridviewredcross

    我有一个数据网格视图和数据表 我使用数据表作为 datagridview 的数据源 我使用线程添加和更新数据 如下所示 如果我处理完数据 我会将其删除 但有两次大红色x在 datagridview 前面 我没查出为什么 以下是我的样本 No
  • 仪器 > 设备灰显

    我正在 iOS 设备上运行一个应用程序 但在 Instruments 中 该设备显示为灰色 这也意味着我无法附加该过程 无法使用设备上的 Instruments 启动 iOS 应用程序 https stackoverflow com que
  • 使用 UIWebView 构建 HTML5 iOS 应用程序

    我有一位客户建议我们只需创建一个 UIWebView 并将所有应用程序逻辑卸载到 HTML5 应用程序即可将 HTML5 应用程序包装为本机 iOS 应用程序 这将使我们能够拥有一个 原生 iOS 应用程序和一个适用于其他设备的优秀移动应用
  • 如何使用C#获取Sql Server 2005的列描述?

    我可以在 C 中使用 Microsoft SqlServer Management Smo Table 来获取 Sql Server 2005 数据库的表列 我已经得到了column Name 但是如何在C 中获取该列的描述 我看过链接 S
  • 如何执行Realm计数查询

    如何在 Realm 上进行计数查询 例如这是我的模型 class Dog Object dynamic var name class Person Object dynamic var name let dogs List
  • 如何从Python文件的末尾开始读取行

    我需要知道如何从 python 文件中读取行 以便我先读取最后一行 然后以这种方式继续 直到光标到达文件的开头 有任何想法吗 解决此问题的一般方法是按行反向读取文本文件 可以通过至少三种方法来解决 一般问题是 由于每行可以有不同的长度 因此
  • java mysql 统计行数

    我创建此代码是为了允许我计算表中的行数 但是 我无法返回计数的数字 并显示错误 无法从结果类型为 void 的方法返回值 有人可以告诉我我的错误在哪里吗 多谢 public void num throws Exception try Thi
  • 马根托。结帐购物车中的数量无法正常使用

    我已经安装了 Magento 1 8 0 并且在本地主机上购物车工作正常 我更改购物车中产品的数量 然后按下 更新购物车 按钮 一切正常 我把网站转移到网上 购物车数量不再起作用了 当我更改产品数量并单击按钮时 数量保持不变 如果我返回并尝
  • 使用 PKG_CHECK_MODULES 时,autoconf 生成的 Makefile 不会传递库头的标志

    我的项目依赖于一个库 更准确地说 GTK 所以我在我的项目中添加了以下配置configure ac PKG CHECK MODULES GTK gtk 2 0 AC SUBST GTK CFLAGS AC SUBST GTK LIBS My
  • 更新到 Asp.Net MVC 4 RTM 后无法加载类型 HttpControllerConfigurationAttribute

    我最初正在使用 ASP Net MVC 4 Beta 和 EF 4 3 1 开发单页应用程序 我更新了 MVC 4 和 EF 5 的所有 NuGet 包 现在 每当我调用 ApiController 或 DbDataController 时
  • 将 SKSpriteNode 添加到 SKEffectNode 时金属崩溃

    gt MTLDebugRenderCommandEncoder setScissorRect 2028 failed assertion rect x 0 rect width 1080 1080 must be lt 240 添加一个简单
  • 构建定义 null

    我使用这段代码来确定特定构建的构建定义详细信息 TfsTeamProjectCollection tpc TfsTeamProjectCollectionFactory GetTeamProjectCollection tfsUri IBu
  • 来自命令行的 PHPUnit - 显示的依赖文件列表。如何让它只显示测试脚本?

    我已经在 Windows 7 上安装了 PHPUnit 以及 PHP 和 Pear 我有一个基本的测试脚本 首先
  • 如何在此父方法中等待异步方法而不使用异步修饰符?

    我有一个想要等待的方法 但我不想引起多米诺骨牌效应 认为任何东西都可以调用这个调用方法并等待它 例如我有这样的方法 public bool Save string data int rowsAffected await UpdateData