2010-04-15 2 views
2

Je me demande s'il existe un moyen de convertir ceci afin qu'il soit plus performant en utilisant un Parallel.For par exemple.Ce code WPF pourrait-il bénéficier de Parallel.For et comment?

public FrameworkElement FindIntersectingElement(Rect rectangle, UIElement activeElement) 
{  
    foreach (var child in this.Children) 
    { 
     if (child != activeElement) 
     { 
      if (GetBounds(child as FrameworkElement, this).IntersectsWith(rectangle)) 
      { 
       return child as FrameworkElement; 
      } 
     } 
    } 

    return null; 
} 

public Rect GetBounds(FrameworkElement of, FrameworkElement from) 
{ 
    GeneralTransform transform = null; 

    transform = of.TransformToVisual(from); 

    return transform.TransformBounds(new Rect(0, 0, of.ActualWidth, of.ActualHeight)); 
} 

Des suggestions?

Répondre

1

Je n'ai pas testé en fait ce qui suit, donc utiliser à vos propres risques (-:.
Je suppose que la lecture ActualWidth/hauteur est thread-safe

public FrameworkElement FindIntersectingElement(Rect rectangle, UIElement activeElement) 
    { 
     FrameworkElement found = null; 

     System.Threading.Tasks.Parallel.ForEach((IEnumerable<UIElement>)MainPanel.Children, 
      (child, loopState) => 
     { 
      if (child != activeElement) 
      { 
       if (GetBounds(child as FrameworkElement, MainPanel).IntersectsWith(rectangle)) 
       { 
        found = child as FrameworkElement; 
        loopState.Stop(); 
       } 
      } 
     }); 
     return found; 
    } 

Et pour répondre à la Titre -question: Vous verrez peut-être une accélération et avec de nombreux éléments imbriqués cela pourrait être utile.Cette (recherche d'arbre) est un cas rare où vous pouvez voir une amélioration meilleure que linéaire

+0

Merci, ça fonctionne très Et avec un grand nombre d'éléments, je vois en effet une accélération (test sur une machine à 8 coeurs) .La restriction de l'affinité à un seul noyau montre la différence e aussi bien – TimothyP

+0

Je ne pense pas que la distribution (IEnumerable ) fonctionnera, puisque UIElementCollection n'est pas un type générique? –

+0

@Chris, Timothy a déjà signalé que cela fonctionne. –