# Procedura: Attraversare un albero binario con attività in paralleloHow to: Traverse a Binary Tree with Parallel Tasks

L'esempio seguente mostra due modi in cui è possibile usare le attività parallele per attraversare una struttura dei dati ad albero.The following example shows two ways in which parallel tasks can be used to traverse a tree data structure. La creazione dell'albero stesso viene svolta come esercizio.The creation of the tree itself is left as an exercise.

## EsempioExample

public class TreeWalk
{
static void Main()
{
Tree<MyClass> tree = new Tree<MyClass>();

// ...populate tree (left as an exercise)

// Define the Action to perform on each node.
Action<MyClass> myAction = x => Console.WriteLine("{0} : {1}", x.Name, x.Number);

// Traverse the tree with parallel tasks.
DoTree(tree, myAction);
}

public class MyClass
{
public string Name { get; set; }
public int Number { get; set; }
}
public class Tree<T>
{
public Tree<T> Left;
public Tree<T> Right;
public T Data;
}

// By using tasks explcitly.
public static void DoTree<T>(Tree<T> tree, Action<T> action)
{
if (tree == null) return;
var left = Task.Factory.StartNew(() => DoTree(tree.Left, action));
var right = Task.Factory.StartNew(() => DoTree(tree.Right, action));
action(tree.Data);

try
{
}
catch (AggregateException )
{
//handle exceptions here
}
}

// By using Parallel.Invoke
public static void DoTree2<T>(Tree<T> tree, Action<T> action)
{
if (tree == null) return;
Parallel.Invoke(
() => DoTree2(tree.Left, action),
() => DoTree2(tree.Right, action),
() => action(tree.Data)
);
}

}


Imports System.Threading.Tasks

Public Class TreeWalk

Shared Sub Main()

Dim tree As Tree(Of Person) = New Tree(Of Person)()

' ...populate tree (left as an exercise)

' Define the Action to perform on each node.
Dim myAction As Action(Of Person) = New Action(Of Person)(Sub(x)
Console.WriteLine("{0}  : {1} ", x.Name, x.Number)
End Sub)

' Traverse the tree with parallel tasks.
DoTree(tree, myAction)
End Sub

Public Class Person
Public Name As String
Public Number As Integer
End Class

Public Class Tree(Of T)
Public Left As Tree(Of T)
Public Right As Tree(Of T)
Public Data As T
End Class

' By using tasks explicitly.
Public Shared Sub DoTree(Of T)(ByVal myTree As Tree(Of T), ByVal a As Action(Of T))
If myTree Is Nothing Then
Return
End If
Dim left = Task.Factory.StartNew(Sub() DoTree(myTree.Left, a))
Dim right = Task.Factory.StartNew(Sub() DoTree(myTree.Right, a))
a(myTree.Data)

Try
Catch ae As AggregateException
'handle exceptions here
End Try
End Sub

' By using Parallel.Invoke
Public Shared Sub DoTree2(Of T)(ByVal myTree As Tree(Of T), ByVal myAct As Action(Of T))
If myTree Is Nothing Then
Return
End If
Parallel.Invoke(
Sub() DoTree2(myTree.Left, myAct),
Sub() DoTree2(myTree.Right, myAct),
Sub() myAct(myTree.Data)
)
End Sub
End Class


I due metodi illustrati sono equivalenti dal punto di vista funzionale.The two methods shown are functionally equivalent. Usando il metodo StartNew per creare ed eseguire le attività, si ottiene un handle dalle attività che è possibile usare per attendere le attività e gestire le eccezioni.By using the StartNew method to create and run the tasks, you get a handle back from the tasks which can be used to wait on the tasks and handle exceptions.