2009-05-14 14 views
10

는이 오류를 받고 있어요? 영어로되어 있나? 부모가 고정 되었습니까? 아니면 고정되어 있습니까? 오류가 사라지면 부모를 얼리지 못하게 만드는 방법은 없습니까? 무슨 일부모가 고정 가능한 항목은 무엇입니까? 이 오류는 무엇을 의미합니까?</p>이 <p>이</p> <p>가도 무엇을 의미 하는가은 Freezable의 부모가 아닌 다른 스레드에 속하는 DependencyObject에를 사용할 수 없습니다 :

는 :

나는 WPF 응용 프로그램에서 두 OpenGL을 윈폼 컨트롤을 가지고 있고, 지금까지 모든 (내 생각) 원활하게 일하고 있어요. 이제 하나의 winform 컨트롤이 이미지를 업데이트 할 때 다른 이미지를 업데이트하도록 업데이트를 추가했습니다. 그건 실제로 작동하는 데 사용, 그리고 지금은 그 오류가 발생했습니다. 코드를 밟으면 임의의 위치에서 충돌이 발생하여 가비지 수집 오류 (예 : 다른 스레드의 일부 업데이트는 가비지 수집 중이고 무작위로 수집이 발생하는 무언가를 생성하고 있음)로 이어집니다.

예외는 주 실행 방법에서 발견되며 InvalidOperationException입니다.

여기 나는 빨대를 쥐고 ​​있습니다. 어디서부터 시작해야합니까?

편집 : 그것은 문제를 일으키는 전화처럼 보이는 것입니다이 하나 : 나는 아직도 그것을 추적하고 있습니다

 if (imagePanel.InvokeRequired) 
     { 
      imagePanel.Invoke(new System.Windows.Forms.MethodInvoker(delegate{ 
       imagePanel.ClearImages(); 
      })); 
     } 
     else 
     { 
      imagePanel.ClearImages(); 
     } 

; 일련의 행이 주석 처리되면 충돌이 여전히 발생하고 스레드 상태에 '방금 종료 된'스레드가 있습니다 (따라서 가비지 수집 가정).

+1

하나 .. –

+1

제목이 매우 잘못되었습니다. 아무도 제목에 없기 때문에 아무도 관련 키워드를 검색하여이 질문을 찾을 수 없습니다. 이것은 지원 포럼이 아니며 귀하의 질문을 적절하게 공식화하지 않습니다 ... – Timwi

+1

안녕하세요 @ 딤 위, 대답을 읽어보십시오. 내가 대답을 찾았 기 때문에 나는이 질문을 남겼다는 것을 깨닫는다. 그러나 그것은 극도로 좌절했다. 제목을 편집하려면 담당자를 더 많이 얻고 어떻게해야한다고 생각하는지 직접 확인하십시오. – mmr

답변

12

좋아, 알아 냈어. 일반적으로이 질문을 삭제 하겠지만 문제를 해결하는 방법에 대한 정보는 찾아야합니다.

ImageBrush theBrush = new ImageBrush(new Bitmap(new Uri(...))); 

if (labelStatus.Dispatcher.Thread == System.Threading.Thread.CurrentThread) { 
    button.background = theBrush; 
} 
else { 
    labelStatus.Dispatcher.BeginInvoke((System.Threading.ThreadStart)(delegate { 
    button.background = theBrush; 
    })); 
} 

그러나 :

문제는이처럼 보였다 전화를했다! 그렇게하면 디스패처가 작동하고 브러시를 삭제하려고 시도하지만 브러시 자체가 분명히 다른 위치에서 삭제되는 것입니다. 당신이 ImageBrush와를 선언하는 경우

그래서, 테이크 홈 교훈은, 다음과 같이, 동일한 스레드에서 삭제된다 문장 다이어그램을하는 것이 도움이 될 것입니다 몇 가지 경우

void MyFunc(){ 
    ImageBrush theBrush = new ImageBrush(new Bitmap(new Uri(...))); 
    button.background = theBrush; 
} 

if (labelStatus.Dispatcher.Thread == System.Threading.Thread.CurrentThread) { 
    MyFunc(); 
} 
else { 
    labelStatus.Dispatcher.BeginInvoke((System.Threading.ThreadStart)(delegate { 
     MyFunc(); 
    })); 
}