有人可以为长时间进程的报告/监控状态/进度建议一个好的设计模式。 基本上,我有一个接收“数据上下文”对象的代码库:
public class DataContext : IDataContext
{
pulbic Dictionary<string, objects> Properties { get; private set; }
// Additional properties removed for simplicity...
}
根据提供的上下文,创建一个任务对象(非TPL-任务),其中包含各种子任务。在执行过程中,DataContext对象传递给各个子任务,以便检索或更新它。
例如,假设主任务是“复制文件”任务。DataContext将具有属性,如SourceFolder和TargetFolder,可能还有一个FilterFiles属性(例如*.docx)。我们的主任务将是CopyFilesTasks,并且它将具有子任务的“管道”——扫描文件夹、扫描文件、过滤文件、复制文件等等...
我正在寻找的是允许任务/子任务向调用者/执行者报告其进度的最佳方法。在我们上面的示例中,进度的变化可能只是“已复制文件ABC.docx...”,或者可能是更加“复杂”的东西,如“正在扫描文件夹XYZ...”
我考虑了以下选项:
INotifyPropertyChanged: 在DataContext中添加一个"Progress"属性。
public string Progress { get; set { _progress = value; RaisePropertyChanged("Progress"); }
并且由创建DataContext对象的代码注册到PropertyChanged事件。然而,这似乎是一个过于简单化的方法...
ILog(使用您喜欢的任何日志记录框架):在各种任务/子任务中使用ILog实例,并让主任务执行者将自己的监听器添加到日志记录框架中。 然而,这似乎是弯曲了日志记录机制去做它不应该做的事情。
Udi Dahan的DomainEvents:任务的执行者可以将DataContext视为一个"领域",因此我们可以尝试为"ProgressChanged"事件实现一个"EventHandler"。理论上,这甚至可以用于更精细的事件,发生在特定的子任务中...但再次,这感觉像是强制概念...
我的担忧包括:
- 进度可能不是唯一需要监视的“事件” - 在我们上面的示例中,我们可能希望更加明确定义,例如FolderHandled,FileCopied等,但是在执行任务时可能不知道确切的事件(请记住 - 子任务是基于DataContext创建的,可能会导致执行不同的任务)。
- 运行任务的上下文尚未定义。目前,我只计划从命令行应用程序运行任务,因此需要将输出发送到命令行以进行调试。稍后,当我将其移动到服务时,我可能希望有一个“监听器”使用任务的进度更新数据库(例如)。