.NET 4.0 中的 IProgress<T>

IProgress<T> in .NET 4.0

是否有一些较旧的 .NET 4.0 等效接口或 IProgress 的 class(仅在 .NET 4.5 中可用)可用于将进度从任务发送到 UI?

或者我应该自己写 class/interface 吗?

IProgress<T> 实际上有两个部分:接口本身和提供的实现,Progress<T>。从技术上讲,该接口甚至不需要跨线程支持,当然这就是它在实践中的使用方式。

界面,您可以从 .NET 4.5 的文档中逐字复制。这只是一个声明。但要使其有用,您还需要实施它。为此,您需要使用 SynchronizationContext 来处理 ProgressChanged 事件的跨线程调用或提供给 Progress<T> 构造函数的处理程序。您可以自己编写整个内容,但恕我直言,从 .NET 源代码中 copy/paste 是合理的:http://referencesource.microsoft.com/#mscorlib/system/progress.cs,d23df0450d3fd0d6

这是一个相对简单的 class,并且不难重新实现,但是实际的 .NET 实现应该没有任何需要其他 4.5 功能的东西,所以 copy/paste 来自来源应该可以正常工作。

也就是说,请注意等效的 功能 实际上在早期版本的 .NET 中可用,形式为 BackgroundWorker class。这结合了通常与 IProgress<T> 一起使用的异步执行和允许异步操作报告进度的 ProgressChanged 事件。由于 4.5 之前只有一个 .NET 版本还包括通常与 IProgress<T> 一起使用的 TPL 支持,因此在 4.5 之前的遗留代码的上下文中使用 BackgroundWorker 可能更有意义。