编程语言
首页 > 编程语言> > C#-等待IO的可重用测试代码

C#-等待IO的可重用测试代码

作者:互联网

我正在尝试在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完成端口的使用.

解决方法:

a code pattern I can copy/paste to use generally when I want to simulate waiting for IO.

Typically Thread.Sleep() is used to simulate a long running task

正如评论中已经提到的,wait 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);
}

标签:async-await,iocp,wcf,c,net
来源: https://codeday.me/bug/20191119/2039507.html