我有一个处理成千上万项目的方法,需要很长时间。
如何正确地让执行长时间操作的方法在执行时报告其进度?
例如,如果我想在我的用户界面中显示另一个线程中某个长时间运行的方法的进度条。
长时间运行的任务可能想以两种方式之一与调用者通信,无论是在专用后台线程中运行还是不在其中:
报告进度(使用BackgroundWorker时对应于调用 BackgroundWorker.ReportProgress
)
检查是否已请求取消(使用BackgroundWorker时对应于检查CancellationPending
属性)。
长时间运行的进程有时候有必要能够以这种方式与调用者通信,而不知道或不关心它是否从BackgroundWorker中运行。 因此,我创建了一个接口IProgress
,通过方法ReportProgress
和属性CancellationPending
抽象出这个功能。 我有一个增强版的BackgroundWorker实现了这个接口,并且还有其他不使用BackgroundWorker的替代实现。
IProgress.ReportProgress
可以使用Console.WriteLine
。其实现IProgress.CancellationPending
可以检查是否按下CTRL-C。相同的长时间运行任务可以从此控制台应用程序和使用BackgroundWorker的WinForms应用程序中调用。