2012-02-11 22 views
11

Arka Plan: Windows XP ve Windows PostReady 2009 PC'lerde çalışan bir .NET 3.5 WPF "Prism" tabanlı uygulama var. Uygulama, her gece (C# çağrısı ile "shutdown.exe" aracılığıyla) kapatılan ve sabahları (Wake-on-LAN üzerinden) yeni önyüklenen bilgisayarlarda çalışır. Uygulama dokunmatik (ELO dokunmatik ekranlar kullanarak), takılı fare veya klavye yok ve kullanıcıların Windows'a erişimi yok.WPF Uygulama Hataları ve .Net Framework Onarımları

Yayın: İki şeyden birinin gerçekleştiği sorunları düzenli olarak görüyoruz; Uygulama doğru yüklenmiyor gibi görünüyor ve boş bir beyaz formunu görüyoruz, ya da dokunmaya yanıt vermiyor. (Log4net) günlüklerimize bakmadan, hala dokunma olaylarını ele aldığımızı ve her iki durumda da çıkış yaptığımızı görebiliyoruz. Genellikle bu, görünümleri değiştirirken ortaya çıkar ve Prism RegionManager'ın uygun şekilde görünümleri kaldırıp eklediği günlüklerde de görürüz.

giderme: Uygulama Clonezilla'nin ile uygulanan görüntüleri kullanarak yaklaşık ~ 100 PC'ler üzerinde çalışan ve bu sadece düzensiz gerçekleşir. Tüm PC'lerde olmadığından ve Olay Görüntüleyicide bir sorun olduğuna dair herhangi bir istisna ya da herhangi bir durum olmadığı için, daha fazla PC ve OS seviyesinde düzeltmelere başvurduk. Spesifik olarak, uygulamayı ve PC'leri ara sıra kısa vadeli başarı ile yeniden başlatmayı denedik - bu bazen uygulamanın yeniden başlatılmasından sonra düzgün bir şekilde çalışacağı anlamına geliyor, ama sadece en fazla saat meselesi. Ayrıca, uygulamanın bir şekilde bozulduğu ve başarılı bir şekilde kaldırdığımız ve yeniden yüklediğimiz varsayımı altında çalıştık.

Sorunu çözen tek şey, sağlanan. Net 3.5 SP1 Yükleyici paketini kullanarak .Net çerçevesinin onarımıdır.

Sonuç: - Ya kodu veya PC'de önyükleme/kapatma prosedürleri yoluyla bu yana biz nasılsa bir GAC'd çerçeve dll bozulmasını olduklarını görebiliyoruz, başka bir şey yaptığında sorunu çözmek gibi görünüyor.

Sorular: Bu soruların bir dizi yol açar: Biz ayrıca sorunun kaynağını tespit edebilirsiniz nasıl

  • Herhangi bir fikir?
  • Bu sorunu önlemek için neler yapabileceğimiz hakkında bir fikriniz var mı?
  • Temel sorunun ne olabileceğine dair herhangi bir fikir var mı?

Yardımlarınız için teşekkür ederiz.

+0

Anlatmak zor… Herhangi bir çok iş parçacığınız var mı? GUI iş parçacığı dışındaki herhangi bir olay tetiklendi mi? – stmax

+0

Herhangi bir zamanda birkaç farklı konu var.Çoğunlukla BackgroundWorker nesneleri olarak oluşturulurlar, ancak bazıları ThreadStart ile açık bir şekilde Thread nesneleri oluşturulur. İşçiler genellikle kısa ömürlüdürler (yaratın, bir kez çalıştırın, yok edin) ve İplikler genellikle uzun sürer (uygulamanın ömrü boyunca işe başlar). Priz toplayıcı olayları GUI iş parçacığı üzerinde oluşturulur. –

+0

Bu makinelerde herhangi bir katı hal sürücü donanımı var mı, yoksa hepsi ucuz sabit disklerle mi çalışıyorlar? Ahh. –

cevap

2

Sonunda, bu davranışı sergileyen bir üretim makinesini ve Microsoft'a döküm dosyalarını gönderme de dahil olmak üzere bir dizi sorun giderme adımından yararlanabildik.

WPF Yazı Tipi Önbelleğe Alma Windows hizmeti, bazen bozuk bir duruma geçerek, süresiz olarak engellenmesi için basit bir önbellek isteğine neden oldu. Bu askıda kalma, WPF uygulamasında yukarıda açıklanan tüm davranışlara neden oldu.

Basit çözüm: hizmeti durdurun ve devre dışı bırakın. Servisi devre dışı bıraktıktan ve bilgisayarı yeniden başlattıktan sonra servis artık kullanılmamaktadır ve bu sorunlardan hiçbirini göremeyiz. Teoride bu daha uzun uygulama yükleme sürelerine yol açar, ancak sıfır olumsuz etki gördük.

Hizmetin iki sürümü olduğunu unutmayın: 3.0.0.0 ve 4.0.0.0. Uygulamanız .Net 3.0 veya 3.5'ı hedefliyorsa, 3 hizmeti devre dışı bırakmanız gerekir ve eğer 4.0'ı hedefliyorsanız 4 hizmetini devre dışı bırakmanız gerekir.

Görüş ve önerileriniz için teşekkür ederiz.

0

Dokunmatik ekranlar bağlanırken WPF uygulamamızla sizinkileri hatırlamanızla ilgili sorunlarımız vardı. Bunun nedeni, .Net'deki otomasyon çerçevesinde bir hatadır. Bizim uygulama ya çok yavaş ya da tamamen GUI iş parçacığı asmak için neden oldu. http://social.msdn.microsoft.com/Forums/en-IE/windowsaccessibilityandautomation/thread/6c4465e2-207c-4277-a67f-e0f55eff0110

geçici çözüm bir periyodik bizim için çalıştı otomasyon olayın dinleyicisi kaldırır nerede yukarıdaki iplik önerilen:

En sorun hakkında daha fazla bilgi bulabilirsiniz.

Bu gerçek bir cevap değil, çünkü yeterli sayıda temsilcim yok mu?(Sanırım) yorum fonksiyonunu kullanamıyorum :)

+0

Bu yorum için geçerli olsa da, yorum için teşekkürler. Otomasyona ya da herhangi bir performans sorununu görmeyiz ve yeniden başlatma ile uzun vadede geri alınamaz. –

0

Küresel bir Hata yakalamayı deneyin ve ne ürettiğini görün.

public partial class App : Application 
    { 
     [STAThread] 
     public static void Main() 
     { 
       var application = new App(); 

       application.DispatcherUnhandledException += 
        new DispatcherUnhandledExceptionEventHandler(application_DispatcherUnhandledException); 

       application.InitializeComponent(); 
       application.Run(); 
     } 

     static void application_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e) 
     { 
      LogAndClose("Global exception: " + e.Exception.ToString()); 
     } 

     public static void Log(string text) 
     { 
      try 
      { 
       System.IO.File.AppendAllText(Environment.CurrentDirectory + "\\Log.txt", 
        "[" + DateTime.Now.ToString("MM/dd/yy HH:mm:ss") + "] " + text + "\r\n"); 
      } 
      catch { } 
     } 

     public static void LogAndClose(string text) 
     { 
      Log(text); 

      try 
      { 
       Application.Current.Shutdown(); 
      } 
      catch { } 
     } 
    } 
+0

İlk günden beri hem dağıtım hem de uygulama alan adı işlenmeyen istisnalar için işleyicilerimiz vardı ve bunları birkaç kez gördüklerini gördük. Burada şans yok. Buna değer bir şey için, dinleyicileri Application.Current.DispatcherUnhandledException ve AppDomain.CurrentDomain.UnhandledException –

-2

Bellek sızıntınız olup olmadığını görmek için ANTS profiler kullanmayı deneyin. Verdikleri sadece 2 haftalık deneme sürümü ile kolayca öğrenebilirsiniz.

+0

'a kaydediyoruz. Bellek sızıntısı buna nasıl sebep olur? – svick

+0

Sistem temiz önyüklemesinden hemen sonra sorun tekrarlanabilir olduğundan bellek sızıntısı görünmüyor. –

0

Üretim sistemini uzaktan ayıklamayı denediniz mi? Uzaktan Hata ayıklamak için gerekenler

şunlardır: geliştirme ve üretim sisteminin

  • arasında

    • dağıtma Msvcmon.exe
    • ağ bağlantısı kodunun yerel ve uzak versiyonu senkronize olduğundan emin olun. Ayrıca, dev makinenizi de yapılandırabilir ve hata ayıklama yapınızı uzak makineye dağıtabilirsiniz. Eğer saf .net kodu ise bu kolay. Ayrıca C++ kodunuz varsa, C++ dlls'in hata ayıklama sürümlerinin üretim makinesinde olduğundan emin olmalısınız. Ya da yayın sürümünü ve uzaktan ayıklamayı oluşturun.
    • Bağlantı için kullanılan bir kullanıcı hesabı ayarlayın. Bu aslında biraz zor. Birkaç ipucu için Google remote debugging credentials.
    • Tüm güvenlik duvarlarını devre dışı bırakmayı unutmayın!

    Halihazırda çalışan bir işleme ekleyebilirsiniz, ancak uygulamayı görsel stüdyosundan da başlatabilirsiniz.

    Geliştirme sisteminiz üretim sisteminden çok uzakta bulunuyorsa, geliştirici stüdyosunu üretim sistemine taşımak için dizüstü bilgisayar ve uzaktan masaüstünü kullanın. Bunu rutin olarak yapıyorum. İkisi arasında beş metrelik mesafe bile sinir bozucu.

    Bu konuyla ilgilenebilirim, eğer ilgi varsa veya bağlantıyı kurarken sorun yaşarsanız.

    İyi şanslar!