2011-10-07 3 views
1

나는 일련의 자식을 유지 관리하는 Silverlight 컨트롤이 있습니다. 어린이 세트는 매우 빠른 속도로 애니메이션 동안 업데이트되며,이처럼 보이는 방법은 컨트롤 변경에 애니메이션 종속성 속성마다 호출됩니다UIElementCollection을 지우면 즉시 내 컨트롤의 자식이 지워지는 것을 보장하려면 어떻게해야합니까?

void SomeMethod(IEnumerable<ChildControlType> childControls) 
{ 
    this.Children.Clear(); 
    foreach(var child in childControls) 
    { 
     this.Children.Add(child); 
    } 
} 

무엇 제가 보는 것은 아이들의 변수 번호는 각에 프레임이지만 항상 필요한 컨트롤로 수렴됩니다. 즉, 모든 프레임에 대해 3 개의 컨트롤이 필요하고 3 개의 자식 컨트롤이있는 IEnumerable을 보내면 대부분의 프레임에서이 메서드가 끝날 때 children 컬렉션에 3 명의 자식이 있습니다. 그러나이 메서드가 끝날 때 Children 컬렉션에는 12 개의 컨트롤이있는 경우가 있습니다. 그 결과 12 개의 컨트롤이 추악하게 보이는 일부 프레임의 컨트롤에 표시됩니다.

누구나 설명 할 수 있습니까?

답변

0

나는 전에이 생각하지 않은 이유를 잘 모르겠어요,하지만 Dispatcher를 사용하는 것으로 someMethod 메소드를 호출하면 문제를 해결할 수 있습니다.

Dependency 속성에 대한 변경된 콜백이 항상 Dispatcher의 스레드에서 호출 되었기 때문에 약간 혼란 스럽습니다. 이 경우 "잠금"문에 왜 같은 효과가 없는지도 확실하지 않습니다. 나는 독서를해야 할 수도 있습니다.

0

SomeMethod은이 예제에서 어떻게 호출되고 있습니까? 당신이보고있는 것이이 방법을 동시에 실행하는 다중 쓰레드 때문일 수도있다. 나는 더에 의해 오전

는 이런 경우가 있는지 의미하지만, 당신은 당신의 방법을 주위에 잠금 추가하여 테스트 할 수 있습니다 :

private volatile object _lockObject = new object(); 

void SomeMethod(IEnumerable<ChildControlType> childControls) 
{ 
    lock (_lockObject) 
    { 
     this.Children.Clear(); 
     foreach(var child in childControls) 
     { 
      this.Children.Add(child); 
     } 
    } 
} 
+0

예. 나는 오프 기회에서 이것을 시도했다. 작동하지 않습니다. 실제로 메서드 호출은 항상 DependencyProperty의 변경된 콜백에서 발생합니다. 내가 이해하기 때문에이 콜백은 UI 스레드에서 항상 호출됩니다. –

+0

나는 그것을 의심했다. 그러나 그것은 시험 할만한 가치가 있었다. 이 경우 저는 아이들을 추가하는 것이 동기가 아니라고 생각합니다. 어쩌면 추가/제거하지 않고 숨기거나 보여줄 수 있습니까? –

0

그 어려운 확신 할 수 있지만에 재진입 문제 같은 소리하는 나 (요즘 우리는 "스레드 안전성"에 대해 많이 고민한다. 우리는 종종 고대의 재진입 문제를 간과하고있다). 이 조정할 수있다보십시오 : -

bool inSomeMethod = false 
void SomeMethod(IEnumerable<ChildControlType> childControls) 
{ 
    if (!inSomeMethod) 
    { 
     inSomeMethod = true; 
     this.Children.Clear(); 
     foreach(var child in childControls) 
     { 
      this.Children.Add(child); 
     } 
     inSomeMethod = false; 
    } 
} 
관련 문제