修改Progress <t>回调操作</t>

时间:2014-01-06 07:35:07

标签: c# task-parallel-library

说我有以下结构:

public struct TaskWithProgress<TResult>
{
    public Task<TResult> Task { get; set; }
    public IProgress<double> Progress { get; set; }
    public string Description { get; set; }
    public CancellationTokenSource CancelTokenSource { get; set; }
}

我希望能够在我的代码中的任何位置创建此结构,并允许Task报告Progress。但是,报告进度时要执行的操作位于一种形式(更新进度条)。通常我会像这样使用progress属性:

Progress = new Progress<double>(x => pb.Position = Convert.ToInt32(100 * x));

有没有办法可以从客户端代码创建这个IProgress<T>,然后再订阅Report()回调?

修改 我可以使用具体实现并使用ProgressChanged事件......但是我不能调用IProgress的Report()方法。这里前进的方向是什么?

1 个答案:

答案 0 :(得分:1)

只需将Progress<T>子类化为一个暴露Report(T value)方法的新类,然后使用该具体类。

public  class ReportingProgress<T> : Progress<T>, IProgress<T>
{
    public ReportingProgress()
    {
    }

    public ReportingProgress(Action<T> handler)
        : base(handler)
    {
    }

    public void Report(T value)
    {
        this.OnReport(value);
    }
}

这与普通的Progress<T>类完全相同,这里是它的Report()方法的代码,来自.NET参考源。

[__DynamicallyInvokable]
[TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
void IProgress<T>.Report(T value)
{
  this.OnReport(value);
}