是否有一些旧版本的.NET 4.0相当于IProgress的接口或类(仅可从.NET 4.5获得),可用于从任务向UI发送进度?
或者我应该为它编写自己的类/接口?
答案 0 :(得分:5)
IProgress<T>
实际上有两个部分:接口本身和提供的实现Progress<T>
。从技术上讲,界面甚至不需要跨线程支持,当然这就是它在实践中的使用方式。
界面,您可以从.NET 4.5的文档中逐字复制。这只是一个宣言。但是为了它有用,你也想要实现它。为此,您需要使用SynchronizationContext
来处理ProgressChanged
事件或提供给Progress<T>
构造函数的处理程序的跨线程调用。您可以自己编写整个内容,但恕我直言,从.NET源代码中复制/粘贴是合理的:http://referencesource.microsoft.com/#mscorlib/system/progress.cs,d23df0450d3fd0d6
这是一个相对简单的类,并且不会很难重新实现,但是实际的.NET实现应该没有任何需要其他4.5功能的东西,因此从源代码复制/粘贴应该可以正常工作。
尽管如此,请注意,等效的功能实际上在早期版本的.NET中以BackgroundWorker
类的形式提供。这将通常与IProgress<T>
一起使用的异步执行与允许异步操作报告进度的ProgressChanged
事件相结合。由于4.5之前只有一个.NET版本也包含通常与IProgress<T>
一起使用的TPL支持,因此在4.5之前的遗留代码的上下文中使用BackgroundWorker
可能更有意义。