我正在尝试在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完成端口的使用。
答案 0 :(得分:3)
代码模式我可以复制/粘贴以便在我想模拟等待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);
}
但是,如果这是一个测试/模拟存根,那么你可能不想要延迟一段时间。异步测试存根通常与Task.FromResult
(或Task.FromException
或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);
}