2017-02-05 4 views
0

mycode :다른 스레드에서 자식을 제거하는 방법은 무엇입니까?

 Canvas myCanvas = new Canvas(); 
>  Rectangle myRectangle = new Rectangle(); 

>     Task.Factory.StartNew(() => 
>     { 
>       while(true) 
>       { 
>        myCanvas.Children.Clear(); 
>       //do something 
>       for(int i=1;i<=100;i++) 
>       { 
>        myCanvas.Children.Add(myRectangle[i]); 
>       } 
          } 
>     }).ContinueWith(t => 
>     { 
> 
>     }, System.Threading.CancellationToken.None, TaskContinuationOptions.None, 
>     TaskScheduler.FromCurrentSynchronizationContext()); 

난 여전히 오류가있어 "시각 지정은 이미 다른 시각 또는 CompositionTarget의 루트의 자식입니다." 내가해야 할 일?

+0

이것은 스레딩과 관련이 없습니다. 컨트롤이 이미 다른 컨테이너에 추가되었을 때 컨트롤을 캔버스에 추가하려고합니다. WPF의 시각적 컨트롤에는 둘 이상의 부모가있을 수 없습니다. – Abion47

+0

이것은 비주얼이 이미 CanvasX에있을 때 두 번째 루프의 _while (true) _ 부분 때문에 발생합니다. – Ron

+0

죄송합니다. 다시 읽으십시오. 스레드 추가를 잊어 버렸습니다. –

답변

1

Dispatcher.Invoke 메서드를 사용할 수 있습니다.

while (true) 
{ 
    Dispatcher.Invoke(new Action(() => { myCanvas.Children.Clear(); })); 
    for (int i = 1; i <= 100; i++) 
    { 
     Dispatcher.Invoke(new Action(() => { myCanvas.Children.Add(myRectangle[i]); })); 
    } 
} 

참고 호출 호출 스레드를 차단합니다.

+0

작품입니다 !! 고맙습니다. 다른 변명을하고 시작을 설명 할 수 있습니까? –

+0

Invoke를 사용하면 호출 스레드가 완료 될 때까지 대기합니다. BeginInvoke에는 해당되지 않습니다. 다른 설명을 원하면 [이 링크] (http://stackoverflow.com/questions/229554/whats-the-difference-between-invoke-and-begininvoke) 또는 google을 참조하십시오. – Ron