Может ли этот код WPF извлечь выгоду из Parallel.For и как? - PullRequest
2 голосов
/ 15 апреля 2010

Мне интересно, есть ли способ конвертировать это, чтобы он был более производительным с помощью Parallel.For, например.

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));
}

Есть предложения?

1 Ответ

1 голос
/ 15 апреля 2010

Я на самом деле не проверял следующее, поэтому используйте на свой страх и риск (-:
Я предполагаю, что чтение ActualWidth / Height является потокобезопасным.

   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;
    }

И чтобы ответить на заглавный вопрос: вы можете увидеть некоторое ускорение, и со многими вложенными элементами это может стоить того. Это (поиск по дереву) является редким случаем, когда вы можете увидеть улучшение, превосходящее линейное.

...