2013-02-15 108 views
0

我有一個Silverlight 5應用程序,它使用ImageTools for SilverlightCanvas保存爲PNG圖像。我知道我需要在UI線程上與Canvas工作,有下面的代碼,它的工作原理:如何確定Dispatcher.BeginInvoke何時完成?

if (saveFileDialog.ShowDialog() == true) 
{ 
    var stream = saveFileDialog.OpenFile(); 

    writeableBitmap.Dispatcher.BeginInvoke(delegate 
    { 
     ExtendedImage extendedImage = writeableBitmap.ToImage(); 

     new PngEncoder().Encode(extendedImage, stream); 
    }); 
} 

的問題是,如果畫布是非常大的,它可以採取顯着的時間代碼BeginInvoke來完成。由於這是在UI線程上運行的,因此它在執行期間會凍結瀏覽器窗口。

當用戶選擇保存導出圖像的位置後,我想彈出一些子窗口,告訴用戶「Please wait ...」,然後運行上面貼出的圖像保存代碼,以及之後自動隱藏子窗口,但是我沒有太多的運氣來完成這個。

對於初學者來說,BeginInvoke代碼異步運行,所以如何知道它何時完成?

回答

1

如果您需要在UI線程上調用ToImage(),那很好,但這並不意味着您必須對圖像進行編碼。

這樣的事情將確保UI保持響應。

if (saveFileDialog.ShowDialog() == true) 
{ 
    using (var stream = saveFileDialog.OpenFile()) 
    { 
     writeableBitmap.Dispatcher.BeginInvoke(delegate 
     { 
      ExtendedImage extendedImage = writeableBitmap.ToImage(); 
      System.Threading.ThreadPool.QueueUserWorkItem(item => 
      { 
       new PngEncoder().Encode(extendedImage, stream); 
      }); 
     }); 
    } 
} 
相關問題