当我想模拟等待 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);
}