.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
可能更有意义。
是否有一些较旧的 .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
可能更有意义。