2013-02-15 3 views
0

ImageTools for Silverlight을 사용하여 Canvas을 PNG 이미지로 저장하는 Silverlight 5 응용 프로그램이 있습니다.Dispatcher.BeginInvoke가 완료되면 어떻게 결정합니까?

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

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

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

문제는 캔버스가 매우 큰 경우는 코드에 대한 눈에 띄는 시간이 걸릴 수 있다는 것입니다 : 나는 UI 스레드에 Canvas 작업을 필요로 작동하는 다음과 같은 코드를 가지고 이해 완료하려면 BeginInvoke. 이것은 UI 스레드에서 실행 중이기 때문에 브라우저 창이 실행되는 동안 동결됩니다.

사용자가 내 보낸 이미지를 저장할 위치를 선택하면 사용자에게 "기다려주십시오 ..."라고 말한 자식 창을 팝업으로 표시 한 다음 위에 게시 한 이미지 저장 코드를 실행하고 이후 자동으로 자식 창을 숨기지 만, 그 일을 성취하는 데별로 행운이 없습니다.

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); 
      }); 
     }); 
    } 
} 
관련 문제