Csharp/C#教程:等待IO的可重用测试代码分享


等待IO的可重用测试代码

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

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

所以我的测试服务目前看起来像这样:

[ServiceContract] public interface IHelloWorldService { [OperationContract] Task SayHello(string firstName, string lastName); } public class HelloWorldService : IHelloWorldService { public async Task 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()用于模拟长时间运行的任务,但我很确定这会使线程池线程进入hibernate状态而不会触发IO完成端口的使用。

一个代码模式我可以复制/粘贴以便在我想模拟等待IO时使用。

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

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

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

但是,如果这是一个测试/模拟存根,那么您可能希望延迟一段时间。 异步测试存根通常与Task.FromResult (或Task.FromExceptionTask.FromCancelled同步实现:

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

但听起来你想要强制异步 。 请注意,在unit testing中需要这样做很少见,但它确实会不时出现。 要在不占用宝贵时间的情况下强制异步,请使用Task.Yield

上述就是C#学习教程:等待IO的可重用测试代码分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

 public async Task SayHello(string firstName, string lastName) { await Task.Yield(); return string.Format("Hello {0} {1}", firstName, lastName); } 

www.ctvol.com true Article Csharp/C#教程:等待IO的可重用测试代码分享

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/992506.html

(0)
上一篇 2021年12月24日 下午10:21
下一篇 2021年12月24日 下午10:24

精彩推荐