EventHandler<T> 和 Progress<T> 的区别?

Difference between EventHandler<T> and Progress<T>?

我想知道使用 EventHandler<T>Progress<T> 之间的区别。有没有哪种情况是更好的选择?

在处理 async Tasks 时,我经常看到人们使用 EventHandler<T> progressChangedCallback 订阅对象的 ProgressChanged 事件并报告进度变化,例如UI 上的进度条。我还看到人们将 IProgress<T> 实例作为参数传递给 Tasks。区别在于它们不调用事件,而是调用 IProgress<T>.Report() 方法。

它们是不同的机制。在 class 上定义了一个事件,并且 IProgress<T> 被传递给异步操作本身。当一次只发生 1 个异步操作时,事件可能更有意义,并且每个此类操作的进度都需要以相同的方式显示,因为 UI 需要订阅单个事件一次,并且它的所有进度更新都以相同的方式处理。当您可以同时进行多个异步操作时,IProgress<T> 可能更有意义,因为它可以让您了解哪个操作正在报告哪个进度。

请注意,Progress<T> 可以很好地将进度更新分派回 UI 线程(如果以正确的方式使用),但事件不会这样做。