2017-02-05 2 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()); 

私はまだエラーを得た:「ビジュアル指定は、すでに別のVisualの子やCompositionTargetのルートです。」私は何をすべきか?

+0

これはスレッディングとは関係ありません。コントロールが既に別のコンテナに追加されているときに、キャンバスにコントロールを追加しようとしています。 WPFのビジュアルコントロールは、複数の親を持つことはできません。 – Abion47

+0

これはビジュアルがすでにCanvasXに入っているときに、2番目のループの_while(真)_部分のために発生します。 – 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

関連する問題