【问题标题】:Modify the Progress<T> callback Action修改 Progress<T> 回调 Action
【发布时间】:2014-01-06 07:35:07
【问题描述】:

假设我有以下结构:

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 = new Progress<double>(x => pb.Position = Convert.ToInt32(100 * x));

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

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

【问题讨论】:

    标签: c# task-parallel-library


    【解决方案1】:

    只需使用一个公开 Report(T value) 方法的新类继承 Progress&lt;T&gt;,并改用该具体类。

    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&lt;T&gt; 类完全相同,这里是它的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);
    }
    

    【讨论】:

      猜你喜欢
      • 2018-07-15
      • 1970-01-01
      • 1970-01-01
      • 2013-11-07
      • 2022-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多