Herkes, uzun süreçlerin durumunu/ilerlemesini raporlamak/izlemek için iyi bir Tasarım Kalıbı önerebilir. Resim bağlamda dayanarakUzun süreçlerin raporlanması/izlenmesi için tasarım deseni
public class DataContext : IDataContext
{
pulbic Dictionary<string, objects> Properties { get; private set; }
// Additional properties removed for simplicity...
}
, bir görev (değil TPL-Görev) nesne oluşturulduğunda, farklı alt görevler ile: Temel olarak, bir "veri içeriği" nesne alan bir kod temeli vardır. Yürütme sırasında DataContext nesnesi, farklı alt görevlere aktarılır ve bunları geri alabilir veya güncelleyebilir. Örneğin, ana görevin bir "Dosyaları kopyala" görevi olduğunu varsayalım. DataContext, SourceFolder ve TargetFolder ve belki bir FilterFiles özelliği (ör. * .docx) gibi özelliklere sahip olacaktır. Ana görevimiz bir CopyFilesTasks olacak ve bir "pipeline" altkümesi olacak - Tarama Klasörleri, Dosyaları Tara, Dosyaları Filtrele, Dosyaları Kopyala, vb ...
Aradığım en iyi yoldur Görev/alt görevlerin ilerlemesini arayan/yürütücüye bildirmelerine izin vermek. Yukarıdaki örneğimizde, devam eden değişiklikler sadece "Kopyalanan dosya ABC.docx ..." ya da "Klasör XYZ ... tarama" gibi biraz daha "karmaşık" bir şey olabilir.
Düşündüm aşağıdaki seçenekler: INotifyPropertyChanged
: DataContext
bir "İlerleme" özelliği eklemekkamu dize İlerleme {get; {_progress = değer; ("Progress") RaisePropertyChanged;
ve DataContext nesnesinin oluşturulduğu kodu PropertyChanged olayına sahip ol. çeşitli görevler/alt görevlere bir Ilog örneğini kullanın ve ana görev cellat vardır: Ancak, bu
Ilog (tercih ne olursa olsun günlük çerçevesini kullanarak) ... bir çok-basit bir yaklaşım gibi görünüyor günlüğe kaydetme çerçevesine kendi dinleyicisini ekleyin. Ancak bu, yapılması gereken şeyleri yapmak için kayıt mekanizmasını bükme gibi görünüyordu.
Udi Dahan en DomainEvents: görevin cellat bir "etki" olarak DataContext'i kabul edebilir ve bu nedenle bir "ProgressChanged" etkinliği için "EventHandler" uygulamaya deneyebilirsiniz.
: Teoride, bu hatta
Benim endişeleri
gibi şeyleri içerir ... Belirli alt görevlere meydana ... Ama bir kez daha, bu kavram zorlayarak gibi hissediyor daha rafine etkinlikler için kullanılabilecek- İlerleme, izlenmesi gereken tek "olay" olmayabilir - yukarıdaki örneğimizde, FolderHandled, FileCopied, vb. Gibi daha fazla tanımlanmış şeyler isteyebiliriz, ancak yürütme sırasında tam olayları bilmiyor olabiliriz görevleri (hatırlayın - alt görevler DataContext'e dayalı olarak oluşturulur ve farklı görevlerin yürütülmesine neden olabilir).
- Görevlerin yürütülmesi bağlamı henüz tanımlanmadı. Şimdilik, sadece görevleri komut satırı uygulamasından çalıştırmayı planlıyorum, bu yüzden hata ayıklama için komut satırına çıktı almak gerekiyor. Daha sonra, bunu bir servise götürdüğümde, bir "dinleyici" nin görevlerin ilerlemesiyle (örneğin) bir veritabanını güncellemesini isteyebilirim.
İhtiyacım olan bu değil - Arka plan iş parçacıklarında kodu çalıştırma konusunda bir sorunum yok ... Daha fazla "tam" bir çözüm arıyorum ve yalnızca bir ilerleme çubuğunun nasıl güncelleneceğini değil UI (BTW, şu anda bir UI bile yok ve muhtemelen asla olmayacak) – SaguiItay