Любой может предложить хороший шаблон проектирования для отчетности / мониторинга состояния / хода длительных процессов. По сути, у меня есть кодовая база, которая получает объект «контекст данных»:
public class DataContext : IDataContext
{
pulbic Dictionary Properties { get; private set; }
// Additional properties removed for simplicity...
}
На основе предоставленного контекста создается объект Task (не TPL-Task) с различными подзадачами. Во время выполнения объект DataContext передается в различные подзадачи, которые могут его извлекать или обновлять.
Например, предположим, что основная задача - это задача «Копировать файлы».DataContext будет иметь такие свойства, как SourceFolder и TargetFolder, и, возможно, свойство FilterFiles (например, * .docx). Нашей основной задачей будет CopyFilesTasks, и у нее будет «конвейер» из подзадач - сканирование папок, сканирование файлов, фильтрация файлов, копирование файлов и т. Д.
То, что я ищу, является лучшим способом разрешить задаче / подзадаче сообщать о своем прогрессе вызывающему / исполнителю. В нашем примере выше текущие изменения могут быть просто «Скопированный файл ABC.docx ...» или, возможно, что-то более «сложное», например «Сканирование папки XYZ ...»
Я рассмотрел следующее параметры:
INotifyPropertyChanged : добавить свойство «Progress» в публичную строку DataContext
Progress {get; установить {_progress = значение; RaisePropertyChanged («Прогресс»); }
и иметь код, создавший объект DataContext, зарегистрированный в событии PropertyChanged. Однако это кажется слишком упрощенным подходом ...
ILog (используя любую структуру ведения журнала, которую вы предпочитаете): используйте экземпляр ILog в различных задачах / подзадачах, и пусть исполнитель основной задачи добавляет это собственный слушатель фреймворка ведения журнала. Однако это выглядело как изменение механизма ведения журнала для выполнения того, чего он не должен был делать.
Уди Дахан DomainEvents : исполнитель задачи может рассматривать DataContext как «домен», и поэтому мы можем попробуйте реализовать «EventHandler» для события «ProgressChanged». Теоретически это можно использовать даже для более сложных событий, которые происходят в определенных подзадачах ... Но, опять же, это похоже на принудительное применение концепции ...
Меня беспокоят такие вещи, как: