2013-06-21 66 views
0

後,我有一些麻煩,此代碼:C#WPF UI凍結使用的MemoryStream

private Bitmap WriteableBitmapToBitmap(WriteableBitmap wb) 
{ 
    BitmapEncoder encoder = new BmpBitmapEncoder(); 
    encoder.Frames.Add(BitmapFrame.Create(wb)); 
    using (MemoryStream ms = new MemoryStream()) 
    { 
     encoder.Save(ms); 
     Bitmap b = new Bitmap(ms); 
     return b; 
     } 
} 

如果我開始這段代碼中,WPF UI凍結。我只想將WriteableBitmap轉換爲位圖,以便我可以將它用於Emgu圖片處理。 WriteableBitmap是從Kinect的Depthdata創建的。我是編程新手,所以肯定有更好的方法,但我希望這也能起作用。

任何人都可以幫助我解決這個問題嗎?

+0

如果UI凍結並不意味着代碼是錯誤的,這意味着你不應該在UI線程中執行它;你應該在非UI線程中做長時間運行的UI工作。關於如何將工作轉移到非UI線程有一百萬個參考。 – Servy

+0

好的,謝謝,我會檢查一下。 – AcBx

+0

冷凍不會是我期望的典型結果。但是代碼當然是錯誤的,只要Bitmap對象是生命的,就不能丟棄MemoryStream。它需要能夠稍後訪問流。刪除*使用*語句。 –

回答

0

這有點晚,但我想補充一些信息。

問題是,您使用的是使用UI線程的同步調用,與其他所有同步調用不同,此調用需要一些時間,因此,您的應用程序將被凍結,直到調用完成。

您需要使用異步調用,以便您的UI線程將免費,以便UI不會被凍結。

有許多方法可以進行異步調用,比如打開一個新的任務,線程或我更喜歡的方式,就是使用async await,這非常棒 - 您可以編寫同步代碼並添加異步,並在正確的地方等待,woops - 這是一個異步代碼!

要了解有關異步的更多信息,請點擊here