2014-01-06 2 views
2

이 오류가 발생합니다. 코드는 다음과 같습니다.오류 : 다른 스레드가이 스레드를 소유하고 있기 때문에 호출하는 스레드가이 개체에 액세스 할 수 없습니다.

Image image; 
    BitmapImage BmpImg; 
    MemoryStream ms; 

    public void Convert() 
    { 
     ms = new MemoryStream(); 
     image.Save(ms, ImageFormat.Jpeg); 

     BmpImg = new BitmapImage(); 
     BmpImg.BeginInit(); 
     BmpImg.StreamSource = new MemoryStream(ms.ToArray()); 
     BmpImg.EndInit(); 
    } 

    private void Btn_Click(object sender, RoutedEventArgs e) 
    {  
     Dispatcher.Invoke(new Action(() => { Image.Source = BmpImg; })); 
    } 

System.Drawing.Image를 BitmapImage로 변환하고 wpf에 표시하는 방법은 무엇입니까?

+1

UI 스레드가 아닌 스레드에서 수행하지 마십시오. – Will

+0

또한, 다른 메모리 스트림을 만들 필요가 없으며 단지'ms.Position = 0;'을 수행하면 기존 메모리 스트림을 재사용 할 수 있습니다. – Luaan

답변

5

BmpImg은 배경 스레드에서 생성됩니다. UI 스레드가 아닌 스레드에서 생성 된 Image Source DP 개체에 바인드 할 수 없습니다.

Dispatcher을 사용하고 있으므로 UI ​​스레드에 위임하는 방법을 지금 가정합니다.

Dispatcher를 통해 UI 스레드에 BmpImg을 작성하면됩니다.

이 경우에도 UI 디스패처를 사용할 수 있습니다 (App.Current.Dispatcher).

또는

으로 @Clemens는 BitmapImage 인스턴스에 Freeze()를 호출하는 경우, 당신이 스레드를 통해 액세스 할 수 있습니다, 의견 제안했다.

BmpImg.Freeze() 
+4

사실 전적으로 사실입니다. 'BmpImg.Freeze()'를 호출 한 후에 작동합니다. – Clemens

+0

그래,하지만 OP는'Freeze'를 호출하지 않았으므로 나는 이것을 제안했지만 답변에서 업데이트 할 것이다. 감사! –

+0

고마워요 @ 클레멘스. BmpImg.Freeze()가 작동했습니다! +1 – Vinshi