Visual Basic em Português

Página pessoal de Jorge Paulino sobre o Visual Basic (VB.NET, ASP.NET, VB6, VBA) e algumas noticias de tecnologia

VS2010 RC1: Task Parallel Library – Parallel.Invoke()

Nos artigos anteriores sobre a Task Parallel Library (TPL) foram referidos os métodos Parallel.For e Parallel.ForEach que servem essencialmente para criar ciclos que podem correr em paralelo. Este método, o Parallel.Invoke, serve para executar processos que decorrem eventualmente em paralelo.

Quando os processos são invocados, são separados nos diversos núcleos do processador e o código só avança quando todos tiverem terminado.

Eis um exemplo do funcionamento:

Imports System.Threading
Imports System.Threading.Tasks

Module Module1

  Private Sub task1()
    For x As Integer = 0 To 50
      Console.WriteLine("Task1 - {0}", x.ToString())
      System.Threading.Thread.SpinWait(50000000)
    Next
  End Sub

  Private Sub task2()
    For x As Integer = 0 To 50
      Console.WriteLine("Task2 - {0}", x.ToString())
      System.Threading.Thread.SpinWait(50000000)
    Next
  End Sub

  Sub Main()

    ' Chama as diversas acções (incluindo uma Lambda)
    Dim actions() As Action = {AddressOf task1, AddressOf task2,
                                 Sub()

                                   ' Usando uma Lambda Expression
                                   For x As Integer = 0 To 50
                                     Console.WriteLine("Task3 - {0}", x.ToString())
                                     System.Threading.Thread.SpinWait(50000000)
                                   Next

                                 End Sub}

    Parallel.Invoke(actions)

    Console.WriteLine("Acções completas!")

  End Sub

End Module

Executando o mesmo, mas sequencialmente (onde o tempo de execução é significativamente superior):

Imports System.Threading
Imports System.Threading.Tasks

Module Module1

  Private Sub task1()
    For x As Integer = 0 To 50
      Console.WriteLine("Task1 - {0}", x.ToString())
      System.Threading.Thread.SpinWait(50000000)
    Next
  End Sub

  Private Sub task2()
    For x As Integer = 0 To 50
      Console.WriteLine("Task2 - {0}", x.ToString())
      System.Threading.Thread.SpinWait(50000000)
    Next
  End Sub

  Sub Main()

    task1()
    task2()

    For x As Integer = 0 To 50
      Console.WriteLine("Task3 - {0}", x.ToString())
      System.Threading.Thread.SpinWait(50000000)
    Next

  End Sub

End Module

E é o terceiro e último evento da classe Parallel. Como se pode ver nos exemplos apresentados(For, ForEach e Invoke), são muito simples de utilizar e vai de certeza ajudar a melhorar o desempenho das aplicações.

1 comentários:

Anónimo disse...

Interessante.. bom ver o .NET a evoluir..

É um pouco confuso a syntax.. mas parece valer apena perceber bem isso..

Mensagens Recentes



Microsoft Office Especialist

Membro da Comunidade
Experts-Exchange


Administ. da Comunidade
Portugal-a-Programar



Twitter

Artigos no CodeProject

Artigos no CodeProject

Subscrever Novidades

Endereço de Email:

Delivered by FeedBurner

Seguidores

Histórico