了解进度课程

时间:2019-05-11 10:59:35

标签: c# .net multithreading

正如标题所述,我想了解类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);
    }
}

在单线程程序中,我们不会观察到ProgressMyProgress之间的任何区别。但是,如果尝试在WPF应用程序中使用MyProgress类从不拥有WPF表单的线程更新进度条,则会得到InvalidOperationException

因此,Progress.Report似乎在调用其拥有的线程中的处理程序方面做了一些魔术。 Report方法的正确实现是什么?

1 个答案:

答案 0 :(得分:2)

它内部使用SynchronizationContext来调用SynchronizationContext线程上的方法,对于WPF,该方法将是UI线程。

源代码:https://referencesource.microsoft.com/#mscorlib/system/progress.cs,5e92455af584587d,references