说我有以下结构:
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()方法。这里前进的方向是什么?
答案 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);
}