Uzun süren bir programı programlı olarak izleme


11

Şu anda ne var bu sahte kod ile özetlenebilir:

public static void Main(string[] args)
{
    var listOfObjects = Database.GetObjectsToUploadToOnlineService();
    Parallel.ForEach(Upload)
}

private static void Upload(MyUploadObject obj)
{
    //Build object (takes a few milliseconds)
    //Format to JSON (takes a few more milliseconds)
    //Upload (can take up to a max of 10 minutes)
    //Wait for a response (can take up to a max of 10 minutes)
    //Save response to our database (takes a few milliseconds)
}

Bu program sunucumuzda zamanlanmış görev olarak ayarlanmıştır. Programa sahibiz ve programla istediğimizi yapabiliriz. Sorum, otomatik izleme denetimleri yapma konusunda bir blogdan kaynaklanıyor (kullanışlı bir bağlantım yok).

Bu beni düşündürdü: Başka bir "izleme" programı başlatabilmek için programımı nasıl değiştirebilirim? Yoksa bu bir konsol programı olmaktan gizli bir WPF programı olarak mı değişmeli ?

Genel olarak, bilgisayarımdaki programın ağ üzerinden ilerlemesini kontrol eden bir programı çalıştırmayı tercih ederim, bu yüzden durumunu kontrol etmek için sunucuya RDP'ye ihtiyacım yok (ancak dünyanın sonu ol).

Genel olarak, sanırım şuna benzer bir pencere görmek istiyorum: İşlem x of y şu ana kadar aşağıdaki öğeler işleniyor. Tablodaki öğeleri liste halinde listeleyin ve "Yükleme" veya "Yanıt bekleniyor" gibi ifadelerini söyleyin. Belki çıldırırsam da nasıl bir başarısız öğeleri bir kuyruk olabilir (ama bu sadece ekstra olurdu).

Aklım bir etkinliğe doğru eğiliyor, ancak çalışan bir programa abone olup aboneliği iptal edebilecek bir programı nasıl çalıştıracağımı anlayamıyorum. Bu mümkün mü?


(10 dakika süren) yükleme / yanıtlama işlemlerindeki ilerlemeyi izlemek mi istiyorsunuz yoksa "Parallel.ForEach" döngüsünde kaç yükleme gerçekleştiğini bilmek ister misiniz?
Doc Brown

@DocBrown bkz. Düzenleme. (son iki paragraf)
Robert Snyder

1
Bana istediğin gibi geliyor belki basit bir UDP alıcı programı. Durum paketlerini ağa bırakabilirsiniz ve bunları alacak hiçbir şey yoksa, zarar vermez.
Robert Harvey

Yanıtlar:


7

İhtiyacınız olan şey, programları birbirine bağlamayan programlarınız arasında iletişim kurmanın bir yoludur. Bunu yapmanın birkaç yolu vardır, görevin bir dosyaya yazmasını ve dosyadan okumayı izlemesini, WCF aracılığıyla görevi kullanılabilir hale getirmesini, böylece monitörün değişiklikler için 'yoklaması', ağı kullanması gerekebilir ...

Tekerleği yeniden icat etmekten kaçınmak için log4net kayıt hedeflerine bir göz atın Eğer böyle bir şey uygulayacak olsaydım muhtemelen log4net kullanır ve UDP veya Telnet'e giriş yapar ve diğer ucundaki monitöre bağlanır. log4net, etkin bir monitör olmadığında istisnalar atmamak da dahil olmak üzere sizin için her şeyi halleder.


Ben zaten zaten log4net kullanıyoruz çünkü bu cevap ile gitmek için giong düşünüyorum .. giriş :) Yani bu onun ne ile güzel uygun olacaktır. Log4net'in bunu yapabileceğine dair hiçbir fikrim yoktu! Teşekkür ederim
Robert Snyder

9

Yorumlarınızdan bir istemci / sunucu veritabanınız olduğunu ve yükleyicinizin zaten bir bağlantı ve yazma erişimine sahip olduğunu görüyorum? O zaman veritabanına bir "izleme" veya "durum" tablosu eklemek ve yükleyicinizin ilerlemesini orada rapor etmesine izin vermek en kolay yol olacaktır (muhtemelen her bir "ilginç" adımı, muhtemelen yukarıda listelediğiniz 5 adımı günlüğe kaydedin).

Durumu görüntülemek için, GUI ile veritabanına bağlanan ve durumu görüntüleyen ikinci bir program oluşturun (örneğin, 1 dakikalık aralıklarla yoklayarak). Oradan veritabanına bağlanmak mümkün olduğu varsayılarak, bu programı yerel masaüstünüzde çalıştırabilirsiniz.

Tabii ki, bir durum tablosuna yazarken veritabanı işlemlerinizi engelliyorsa, ayrı bir bağlantı kullanabilirsiniz. Bunun için MSQM gibi bir mesaj kuyruğu mekanizması da kullanabilirsiniz , ancak bu basit durumunuz için büyük boyutlu bir çözüm olabilir.


+1 Bu, basit tutmak ve çok karmaşık olmaması gereken bir şeyi aşırı karmaşıklaştırmamak için en iyi yaklaşımdır.
Thomas Stringer

3

@ JDT'nin cevabına dayanmak için, bunu yapmanın yaygın bir yolu bir mesaj kuyruğuna mesaj yazmaktır. Uygulamanızda önemli bir şey olduğunda, bir mesaj yazar ve mesaj kuyruğuna gönderir. Genellikle iletinin biçimi XML veya benzeridir. Bu sıra yazarı.

İzleme uygulaması kuyruğu okur (kuyruk okuyucu) ve mesajları kaydeder ve kaydederek ve önceki mesajlara veya koşullara göre mesajı analiz ederek işler. Bir koşul yerine getirilirse, izleme uygulaması olası bir sorunu belirten bir uyarı verir.

Bu, uygulamanızı yalnızca iletileri kovduğu için kendisini izlemekten ayırır. Mevcut mesajlara dayanarak iyi ya da kötü bir şeyin olduğunu belirlemek izleme uygulamasına bağlıdır. Kuyruklar kullanılır çünkü mesajlar kayıpsız saklamak için iyi bir araç sunar.

Uygulamanızın çalışmakta olduğu birden fazla örnek varsa mesajlaşmayı merkezi hale getirmek istiyorsunuz. Yalnızca 1 örnek varsa, windows olay günlüğü veya dosya gibi diğer depoları kullanmak yeterli olabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.