2015-12-21 16 views
5

Herhangi bir yerde çözemediğim veya Google çözümünü çözemediğim bir sorunla karşılaşıyorum.Windows hizmeti: BitmapEncoder veya BitmapDecoder kullanımı «İşlem başarıyla tamamlandı» ile biter

Görüntüleri yükleyen veya kaydeden ve BitmapEncoder veya BitmapDecoder sınıflarını kullanan bir hizmet çalıştırıyorum. Bir süre sonra (görüntüleri ne sıklıkta kaydeddiğimi/yüklediğime bağlı olarak), görüntüleri kaydetmeyi/yüklemeyi reddeder. Önce

yığın ayırma ile olay günlüğüne uyarı bkz Ben ne anlama geliyor googled ve GDI sınırlı sayıda Windows hizmet sahip olduğunu nesneleri ile ilgisi var

başarısız oldu. Bu nesneyi artırmak için kayıt defterini değiştirmek mümkün ama çok hoş olmayan bir çözüm olduğunu düşünüyorum ve benim için de işe yaramıyor.

Kodum

Error while storing image : System.ComponentModel.Win32Exception (0x80004005): The operation completed successfully 
    at MS.Win32.HwndWrapper..ctor(Int32 classStyle, Int32 style, Int32 exStyle, Int32 x, Int32 y, Int32 width, Int32 height, String name, IntPtr parent, HwndWrapperHook[] hooks) 
    at System.Windows.Threading.Dispatcher..ctor() 
    at System.Windows.Threading.DispatcherObject..ctor() 
    at System.Windows.Media.Imaging.BitmapEncoder..ctor(Boolean isBuiltIn) 
    at Imaging.TiffReadWrite.Save(String filename, Image img) 

kaydedilirken ve görüntüleri kaydetmek için

Error while loading image : System.ComponentModel.Win32Exception (0x80004005): The operation completed successfully 
    at MS.Win32.HwndWrapper..ctor(Int32 classStyle, Int32 style, Int32 exStyle, Int32 x, Int32 y, Int32 width, Int32 height, String name, IntPtr parent, HwndWrapperHook[] hooks) 
    at System.Windows.Threading.Dispatcher..ctor() 
    at System.Windows.Threading.DispatcherObject..ctor() 
    at System.Windows.Media.Imaging.BitmapDecoder..ctor(Stream bitmapStream, BitmapCreateOptions createOptions, BitmapCacheOption cacheOption, Guid expectedClsId) 
    at Imaging.TiffReadWrite.Load(String filename) 

Kodum yüklerken yığın izleme istisna aşağıdaki gibi görünür atar:

public static void Save(string filename, BitmapSource img) 
{ 
    using (FileStream stream = new FileStream(filename, FileMode.Create)) 
    { 
     TiffBitmapEncoder encoder = new TiffBitmapEncoder(); 
     encoder.Compression = TiffCompressOption.None; 

     BitmapFrame frm = BitmapFrame.Create(img); 

     encoder.Frames.Add(frm); 
     encoder.Save(stream); 
    } 
} 

ve için yükleme görüntüleri gibi görünüyor:

public static BitmapSource Load(string filename) 
{ 
    BitmapSource resultImage = null; 

    using (Stream imSource = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read)) 
    { 
     var decoder = new TiffBitmapDecoder(imSource, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.Default); 
     resultImage = decoder.Frames[0]; 
    } 
    return resultImage; 
} 

Bu nedenle, servis resimleri kaydetmeyi/yüklemeyi reddeder. Bu özel durumu deneyebilirim/böylece hizmet çalışmaya devam edebilir, ancak hiçbir görüntü kaydedilemez/yüklenemez. Bazen bu istisnanın ilk ortaya çıkmasından sonra birkaç görüntü kaydedilebilir/yüklenebilir ve bir süre sonra kaydetme/yükleme yapılmaz.

Bu sorunla ilgili tek geçici çözümüm bu kodu hizmette değil, uygulamada çalıştırıyor. Sonra sadece iyi çalışır, ama bu aradığım bir çözüm değil. Daha iyi bir öneri varsa lütfen bana bildirin.

aslında çözülmüş, bir miktar içindeki mesaj (aşağı yukarı aynı olan özel durum yığın iz) vardır:

+0

Bu oldukça işe yaramaz bir istisna mesajdır. Hizmetler, oturum 0'da çalışır, kasıtlı olarak küçük bir masaüstü yığını vardır. Bu, CreateWindowEx() öğesinin başarısız olmasını daha olası kılar. Onun haksız payını btw alarak başka bir hizmet olabilir. Ya da sizinki, Görev Yöneticisi'ndeki "Kullanıcı Nesneleri" sayacı sizin ilk teşhisinizdir. Ayrıca, GC'nin yeterince sık toplanmaması riskiyle karşı karşıya kalırsınız, GC.Collect() 'yi her N bitmap'i arayarak yardım etmeniz gerekebilir. Bununla birlikte, anlamlı bir hata kodu olmaması, bir çevre sorununa işaret etmektedir. –

+0

Cevabınız için teşekkür ederiz. Belirsizliğini biliyorum ve bu yüzden çözemiyorum. Görev yöneticisini kontrol ediyorum ve yalnızca WinLogon'un yüksek kullanım oranına sahip olduğunu öğrendiğim GDI nesnesini izlemek için dheapmon kullandım ama hepsi bu. Başka bir hizmet olabilir, ancak farklı kodlardaki farklı bilgisayarlarda yayınladığım kodu kullandı. Yani pek olası değil. Sanırım zaten daha fazla GC.Collect() çağrım var. Yani bu da işe yaramıyor. –

+0

@TomKos, 'TiffBitmapDecoder' sınıfının yapıcı argümanı olarak' BitmapCacheOption.None 'değerini ve 'BitmapFrame.Create()' yöntem çağrısının argümanı olarak kullanmayı düşünün. –

cevap

2

operasyonu Bu gizemli mesaj başarısız HwndWrapper yapıcısındaki tam kodunu daraltıyor başarıyla

tamamladı. WPF'nin GetStockObject pinvoke bildirgesinde bir hata var. Onun SetLastError = true özelliği yanlış, GetStockObject() aslında bir hata kodu üretir. Hata kodu 0, "hiçbir şey ters gitmedi" açıklamasını görüyorsunuz.

GetStockObject() doğru argümanı alırsa asla başarısız olmayan bir winapi işlevidir. Stok nesneleri önceden tahsis edilir ve asla serbest bırakılmaz. İşlem durumunun tamamen bozulduğuna dair çok güçlü kanıtınız var.Olay günlüğünde "yığın ayırma başarısız" iletisini görmek kesinlikle bu sefaletin bir parçasıdır.

Bu bozulmaya neden yol açabilecek bir fikriniz yoksa, makine güvenilir RAM ile iyi bilinir, tehlikeli yerel bir kod çalıştırmazsınız ve makine masaüstü yığınını bozabilecek başka bir hizmet çalıştırmaz. Sadece sahip olduğunuz tek alternatif, çökmüş sürecin bir minidump'ını yaratmaktır. Microsoft Desteği'ni arayın, GetStockObject() hatasının izini takip edebilirler. İlk destek katmanları, makineyi takas etmenizi söyleyenleri almanız gerektiğine dikkat edin :)

+0

Cevabınız için teşekkür ederiz. Açıklaman için minnettarım. Microsoft Desteği'ni aramayı deneyebilirim ama bunun için fazla bir umurum yok. Bu arada bunu nasıl çözebileceğimi bilmiyorum. –

İlgili konular