等待 IO 的可重用测试代码

2024-02-18

我正在尝试在 WCF 公开的方法/服务上使用 async/await。一切工作正常,但我想模拟实际等待 IO 的服务方法,以便服务调用将注册到 IO 完成端口,并将线程放回到线程池中。

澄清一下,我只是尝试确认 IO 完成端口的使用情况,并更好地了解实际发生的机制。

所以例如我的测试服务目前如下所示:

[ServiceContract]
public interface IHelloWorldService
{
    [OperationContract]
    Task<string> SayHello(string firstName, string lastName);
}


public class HelloWorldService : IHelloWorldService
{
    public async Task<string> SayHello(string firstName, string lastName)
    {
        string str = string.Format("Hello {0} {1}", firstName, lastName);
        return await Task.Factory.StartNew(() => str);
    }
}

我想在 SayHello() 中做一些事情,使该代码等待一些 IO,理想情况下,当我想模拟等待 IO 时,我可以复制/粘贴以通常使用的代码模式。

通常 Thread.Sleep() 用于模拟长时间运行的任务,但我非常确定这将使线程池线程进入睡眠状态,并且不会触发 IO 完成端口的使用。


当我想模拟等待 IO 时,我可以复制/粘贴通常使用的代码模式。

通常 Thread.Sleep() 用于模拟长时间运行的任务

正如评论中已经提到的,await Task.Delay(..)是异步等价的Thread.Sleep(..)。它通常用于表示“未指定的异步操作”。

public async Task<string> SayHello(string firstName, string lastName)
{
    await Task.Delay(TimeSpan.FromSeconds(2));
    return string.Format("Hello {0} {1}", firstName, lastName);
}

但是,如果这是一个测试/模拟存根,那么您可能don't想要延迟实际的时间。一般实现异步测试存根同步地 with Task.FromResult (or Task.FromException or Task.FromCancelled):

public Task<string> SayHello(string firstName, string lastName)
{
    return Task.FromResult(string.Format("Hello {0} {1}", firstName, lastName));
}

但听起来你想要强制异步。请注意,需要在单元测试中执行此操作的情况很少见,但确实有时会出现。要强制异步而不占用宝贵的时间,请使用Task.Yield:

public async Task<string> SayHello(string firstName, string lastName)
{
    await Task.Yield();
    return string.Format("Hello {0} {1}", firstName, lastName);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

等待 IO 的可重用测试代码 的相关文章

  • 分段错误(核心转储)错误

    我的程序编译罚款 但在输入文件时出现 分段错误 核心转储 错误 我没有正确处理 ostream 吗 include
  • 将字节数组转换为托管结构

    更新 这个问题的答案帮助我编写了开源项目GitHub 上的 AlicanC 现代战争 2 工具 https github com AlicanC AlicanC s Modern Warfare 2 Tool 你可以看到我是如何阅读这些数据
  • 在 C# Winforms 应用程序中嵌入 Windows XP 主题

    我有一个旧版 C Windows 窗体应用程序 其布局是根据 Windows XP 默认主题设计的 由于需要将其作为 Citrix 应用程序进行分发 该应用程序现在看起来像经典主题应用程序 因为 Citrix 不鼓励使用主题系统服务 所以
  • mprotect 之后 malloc 导致分段错误

    在使用 mprotect 保护内存区域后第一次调用 malloc 时 我遇到分段错误 这是执行内存分配和保护的代码片段 define PAGESIZE 4096 void paalloc int size Allocates and ali
  • 获取尚未实例化的类的函数句柄

    我对 C 相当陌生 我想做的事情可能看起来很复杂 首先 我想获取一些函数的句柄以便稍后执行它们 我知道我可以通过以下方式实现这一目标 List
  • 从 Code::Blocks 运行程序时出现空白控制台窗口 [重复]

    这个问题在这里已经有答案了 当我尝试在 Code Blocks 中构建并运行新程序时 控制台窗口弹出空白 我必须单击退出按钮才能停止它 它对我尝试过的任何新项目 包括 Hello world 都执行此操作 奇怪的是 它对于我拥有的任何旧项目
  • C# 委托责任链

    为了我的理解目的 我实现了责任链模式 Abstract Base Type public abstract class CustomerServiceDesk protected CustomerServiceDesk nextHandle
  • 预处理后解析 C++ 源文件

    我正在尝试分析c 使用我定制的解析器的文件 写在c 在开始解析之前 我想摆脱所有 define 我希望源文件在预处理后可以编译 所以最好的方法是运行C Preprocessor在文件上 cpp myfile cpp temp cpp or
  • OpenCV 2.4.3 中的阴影去除

    我正在使用 OpenCV 2 4 3 最新版本 使用内置的视频流检测前景GMG http docs opencv org modules gpu doc video html highlight gmg gpu 3a 3aGMG GPU算法
  • 分配器感知容器和propagate_on_container_swap

    The std allocator traits模板定义了一些常量 例如propagate on container copy move assign让其他容器知道它们是否应该在复制或移动操作期间复制第二个容器的分配器 我们还有propag
  • C++11 动态线程池

    最近 我一直在尝试寻找一个用于线程并发任务的库 理想情况下 是一个在线程上调用函数的简单接口 任何时候都有 n 个线程 有些线程比其他线程完成得更快 并且到达的时间不同 首先我尝试了 Rx 它在 C 中非常棒 我还研究了 Blocks 和
  • 使用 mingw32 在 Windows 上构建 glew 时“DllMainCRTStartup@12”的多个定义

    我关注了这个主题 使用 mingw 使建筑物在 Windows 上闪闪发光 https stackoverflow com questions 6005076 building glew on windows with mingw 6005
  • ASP.NET JQuery AJAX POST 返回数据,但在 401 响应内

    我的应用程序中有一个网页 需要调用我设置的 Web 服务来返回对象列表 这个调用是这样设置的 document ready function var response ajax type POST contentType applicati
  • 0-1背包算法

    以下 0 1 背包问题是否可解 浮动 正值和 浮动 权重 可以是正数或负数 背包的 浮动 容量 gt 0 我平均有 这是一个相对简单的二进制程序 我建议用蛮力进行修剪 如果任何时候你超过了允许的重量 你不需要尝试其他物品的组合 你可以丢弃整
  • 初始化 LPCTSTR /LPCWSTR [重复]

    这个问题在这里已经有答案了 我很难理解并使其正常工作 基本上归结为我无法成功初始化这种类型的变量 它需要有说的内容7 2E25DC9D 0 USB003 有人可以解释 展示这种类型的正确初始化和类似的值吗 我已查看此站点上的所有帮助 将项目
  • 从 Delphi 调用 C# dll

    我用单一方法编写了 Net 3 5 dll 由Delphi exe调用 不幸的是它不起作用 步骤 1 使用以下代码创建 C 3 5 dll public class MyDllClass public static int MyDllMet
  • C 中带有指针的结构的内存开销[重复]

    这个问题在这里已经有答案了 我意识到当我的结构包含指针时 它们会产生内存开销 这里有一个例子 typedef struct int num1 int num2 myStruct1 typedef struct int p int num2
  • Visual Studio 2017 完全支持 C99 吗?

    Visual Studio 的最新版本改进了对 C99 的支持 最新版本VS2017现在支持所有C99吗 如果没有 C99 还缺少哪些功能 No https learn microsoft com en us cpp visual cpp
  • 受限 AppDomain 中的代码访问安全异常

    Goal 我需要在权限非常有限的 AppDomain 中运行一些代码 它不应该访问任何花哨或不安全的内容 except对于我在其他地方定义的一些辅助方法 我做了什么 我正在创建一个具有所需基本权限的沙箱 AppDomain 并创建一个运行代
  • OSError: [WinError 193] %1 不是有效的 Win32 应用程序,同时使用 CTypes 在 python 中读取自定义 DLL

    我正在尝试编写用 python 封装 C 库的代码 我计划使用 CTypes 来完成此操作 并使用 Visual Studio 来编译我的 DLL 我从一个简单的函数开始 在 Visual Studio 内的标头中添加了以下内容 然后将其构

随机推荐

  • 出现未捕获类型错误:将 Browserify 与 Nutritionix NodeJS 客户端库一起使用时,fs.readdirSync 不是一个函数

    我正在尝试使用 Node 构建一个演示应用程序 但我不断收到未捕获的类型错误 fs readdirSync 不是函数尝试使用 Nutrionix NodeJS 客户端库时出错 https github com nutritionix nod
  • SAP 通过 VBA 提取到 EXCEL 内存不足

    我正在尝试通过我记录的 SAP 脚本将 SAP 事务提取到 txt 文档中 最后将其提取到我的 Excel 工作表中 当我在 SAP 中运行脚本时 它会通过将值复制到我的 txt 文档中来工作 所以看来我的问题是 excel 中的宏没有激活
  • 如何使用 sed/awk 提取两个模式之间的文本

    我知道这个问题已经被问了 1000 次了 但是我读了很多类似的问题 但仍然没有找到正确的方法来做到这一点 我需要从如下所示的行中提取一个数字 version 4 9 123M info version 2034 2 description
  • 如何对 Eloquent 子查询进行排序

    我有两个连接的表 团队和成员 这些模型通过 n m 关系连接 在我的团队视图中 我将创建一个 foreach 循环来获取所述团队的成员 如下所示 foreach team gt teammember as member member gt
  • 如何检测ListView Item的位置?

    如何根据列表视图项目在屏幕上的位置向其添加填充 例如 如果 listView 项位于屏幕中间 我希望将其内边距增加 10 点 如果 listView 项位于屏幕顶部附近 我希望将其内边距增加 15 点 您可以通过附加一个来实现这一点Scro
  • 安卓 WifiLock 无法使用?

    我需要每 x 分钟通过 WiFi 和 HTTP 从本地网络上的服务器提取数据 服务在后台运行 我使用 AlarmManager 来触发查询 设备上的 Wifi 睡眠策略设置为 从不 问题是 设备在屏幕关闭时进入睡眠状态 并且 wifi 锁似
  • 在不使用 $rootScope 的情况下使用 Angular ui 路由器防止 stateChange

    我的用户可以离开状态 但在我想显示模式对话框 你想保存吗 之前 仅当用户数据脏时才意味着已更改 我不想要的是将 EditController 中的 isDirty 属性粘贴到 rootScope 转到 stateChangeStart 事件
  • 如何使用复合文字来表示具有任意基数的“fprintf()”多个格式化数字?

    我想将多个数字转换为某种表示形式 然后使用的标志 宽度和精度 printf 说明符 首选是避免全局或static缓冲区 关键问题似乎是如何提供char 对于每个转换后的数字 fprintf ostream some format foo i
  • 使用 2 种不同的配置运行 SSIS 包

    我们有一个名为 ExportData 的 SSIS 作业 它接受 ExportType 参数 ExportType 参数可以是 schedule 或 unschedule 我创建了名为 ExportType 的变量 并创建了 SSIS 配置
  • 在 d3.js 中合并数据

    我是 Pythonista 正在尝试学习 d3 js 微笑 我有一个带有套接字的服务器 我的页面订阅了它 服务器以 JSON 形式发送更新 id0 0 38 id1 0 70 id8 0 71 我写了以下简单的页面
  • 比较对象永远不会返回 true

    我试图比较相同类型的两个对象 在方法 doesHave 中 但我从未返回 true 这是我的代码 private ArrayList
  • Swift 数组到元组数组

    我有以下两个数组 let xaxis monday tuesday wednesday thursday friday let yaxis 1 2 3 4 5 我想将它们合并到一个数组中 如下所示 monday 1 tuesday 2 we
  • 使用 requestAnimationFrame 控制 fps?

    这好像是requestAnimationFrame是现在事实上的动画方式 它在大多数情况下对我来说效果很好 但现在我正在尝试做一些画布动画 我想知道 有什么方法可以确保它以特定的 fps 运行吗 我知道 rAF 的目的是为了获得始终如一的平
  • 更改 MySQL Workbench 查询中的注释字体颜色

    是否可以将字体颜色从浅灰色更改为更鲜艳的颜色 GET TODAY S EVENTS ONLY lt this is the font I want to change where event date CURDATE 我目前在 Window
  • ASP.NET 捕获所有路由和转义正斜杠

    我使用 MVC 的包罗万象的路由来提供应用程序中资源的路径 它看起来像这样 routes MapRoute null Resource resourcePath new controller Resource action Open 动作是
  • Guzzle:处理 400 个错误请求

    我在 Laravel 4 中使用 Guzzle 从另一台服务器返回一些数据 但我无法处理错误 400 错误请求 status code 400 reason phrase Bad Request using client gt get ht
  • Github - 流量 - 奇怪的“Git 克隆”统计数据

    我有一个 Github 存储库 其中包含一些令人困惑的 Git 克隆统计信息 如下所示 该存储库没有大量访问者或 Stars 但在 9 月 29 日显示了相对较多的克隆 GitHub流量帮助页面 https help github com
  • 如何在 SVG / raphael 中的贝塞尔曲线末端绘制箭头?

    我有一条由此生成的曲线 var path M x1 toFixed 3 y1 toFixed 3 L arrow left x arrow left y L arrow right x arrow right y L x1 toFixed
  • Python 错误:io.UnsupportedOperation:fileno

    我正在使用服务器和客户端程序here http www bogotobogo com python python network programming tcp server client chat server chat client s
  • 等待 IO 的可重用测试代码

    我正在尝试在 WCF 公开的方法 服务上使用 async await 一切工作正常 但我想模拟实际等待 IO 的服务方法 以便服务调用将注册到 IO 完成端口 并将线程放回到线程池中 澄清一下 我只是尝试确认 IO 完成端口的使用情况 并更