如何在.NET中装饰(时间)任务?

时间:2016-11-18 18:18:34

标签: c# .net asynchronous task-parallel-library task

我的服务类似于:

public class Service : IService
{
    public Task<string> GetData()
    {
        var client = new HttpClient();
        var str = client.GetStringAsync("http://www.example.com");
        return str;
    }
    //...
}

现在,使用装饰器模式我想要计时这个方法

public class TimedService : IService
{
    private readonly IService _service;

    public TimedService(IService service)
    {
        _service = service;
    }

    public Task<string> GetData()
    {
        using(var timer = new TimerContext())
            return _service.GetData();
    }
}        

TimerContext在构建之后开始计时并停止处理并将其发布到某种日志中,而不需要返回测量的时间。

现在使用上述方法不会计算任务的实际执行时间,而只是创建和检索Task实例。

如何从TimedService返回Task,在运行时,将启动计时器,执行原始Task(来自真实Service类)并配置计时器?

1 个答案:

答案 0 :(得分:8)

将方法asyncawait设为Task

public async Task<string> GetData()
{
    using(var timer = new TimerContext())
        return await _service.GetData();
}

现在timer将在GetData完成后处理,而不是在启动后立即处理。