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

标签 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 class) 和配置定时器?

最佳答案

使方法 asyncawait 成为 Task

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

现在 timer 将在 GetData 完成时被释放,而不是在 开始 .

关于c# - 如何在 .NET 中装饰(时间)任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40683636/

相关文章:

javascript - 如何等待异步方法的回调返回值?

C# NullReferenceException 未被用户代码处理

c# - 并行 ForEach 和 ConcurrentBag

c# - WPF MVVM 文本框验证

.net - 自签名和证书颁发机构生成的证书有什么区别

jquery - 使用jquery.form.js的异步上传问题

c# - 异步/等待代码中的竞争条件

c# - 在 C# 中,通过 this.XYZ 访问当前对象的属性与仅 XYZ 相比被认为是糟糕的风格

c# - 如何在 WCF 中定义数据契约?

C# 到 VB.NET 代码转换器