正如标题所述,我想了解类Progress<T>
的实际作用。人们可能会猜测以下实现具有相同的行为:
class MyProgress<T> : IProgress<T>
{
private Action<T> _handler;
public MyProgress(Action<T> handler)
{
_handler = handler;
}
public void Report(T value)
{
_handler?.Invoke(value);
}
}
在单线程程序中,我们不会观察到Progress
和MyProgress
之间的任何区别。但是,如果尝试在WPF应用程序中使用MyProgress
类从不拥有WPF表单的线程更新进度条,则会得到InvalidOperationException
。
因此,Progress.Report
似乎在调用其拥有的线程中的处理程序方面做了一些魔术。 Report
方法的正确实现是什么?
答案 0 :(得分:2)
它内部使用SynchronizationContext
来调用SynchronizationContext线程上的方法,对于WPF,该方法将是UI线程。
源代码:https://referencesource.microsoft.com/#mscorlib/system/progress.cs,5e92455af584587d,references