2016-04-13 12 views
2

Bir zip dosyasından bir görüntüyü açan ve bu görüntüyü bir BitmapImage olarak döndüren bir yönteme sahibim.BitmapImage: BitmapImage'ın görüntüyü döndürmeden önce başlatılması için nasıl bekleyebilirim? (C# .NET)

public BitmapImage GetImageFromSource() 
{ 
    using (System.IO.Compression.ZipArchive zi = System.IO.Compression.ZipFile.Open(ZipFileLocation, System.IO.Compression.ZipArchiveMode.Read)) 
    { 
     using (Stream source = zi.GetEntry(InternalLocation).Open()) 
     { 
      BitmapImage img = new BitmapImage(); 
      img.BeginInit(); 
      img.CacheOption = BitmapCacheOption.OnLoad; 
      img.StreamSource = source; 
      img.EndInit(); 

      //sleeping here allows img to complete initialization 
      //not sleeping here means img is still blank upon return 
      System.Threading.Thread.Sleep(100); 

      return img; 
     } 
    } 
} 

Zip dosyası büyük ve küçük resimlerden oluşan bir karışım içerir. Görüntü büyükse, program, dönüşe ulaşmadan önce başlatmayı tamamlamış olmayabilir. Bu olursa, yöntem boş bir BitmapImage döndürür.

Dönmeden önce uyursam, yöntem çalışır ve yeterli bir gecikmeyle büyük resimler başarıyla başlatılır.

Uyku, ana parçacığı gereksiz yere kilitleyerek programı yavaşladığından ideal değildir. BitmapImage döndürmeden önce başlatma için beklemek için yöntemini nasıl alabilirim?

IsDownloading ve DownloadCompleted olayını denedim. İndirme her zaman 'true' olarak ayarlanır ve DownloadCompleted hiçbir zaman tetiklenmez.

+0

mu [ 'DownloadCompleted'] (https://msdn.microsoft.com/en-us /library/system.windows.media.imaging.bitmapsource.downloadcompleted(v=vs.110).aspx) olay ateşi belki de? – DavidG

+0

Bu garip - sadece bazen. Bu, ancak img'nin halihazırda başlatmayı bitirme zamanı verildiği zaman (örneğin, Uyku kullanarak) ateşlenir. –

cevap

2

Bitmap'in yüklenmesini bekleyen ana iş parçacığının kilitlenmesi gerçekten iyi bir uygulama değildir, çerçevenin bir nedenle yükü ertelemesi gerekebilir. Bu aslında burada olup bitenler, ve yük gerçekleştiğinde, dosya değişkenlerini zaten elden bırakmışsınızdır. Sen hemen bir görüntü dönebilirsiniz ancak dosya yüklendiğinde sonrasına kadar bu değişkenlerin elden ertelemek gerekir:

public BitmapImage GetImageFromSource() 
{ 
    System.IO.Compression.ZipArchive zi = System.IO.Compression.ZipFile.Open(ZipFileLocation, System.IO.Compression.ZipArchiveMode.Read); 
    Stream source = zi.GetEntry(InternalLocation).Open(); 

    BitmapImage img = new BitmapImage(); 
    img.DownloadCompleted += (s, e) => 
    { 
     source.Dispose(); 
     zi.Dispose(); 
    }; 

    img.BeginInit(); 
    img.CacheOption = BitmapCacheOption.OnLoad; 
    img.StreamSource = source; 
    img.EndInit(); 

    return img; 
} 
İlgili konular