Jorge Paulino

Visual Basic em Português, MVP

Recent Posts

Tags



 
Administr. da Comunidade
Portugal-a-Programar


Membro da Comunidade
Experts-Exchange


Twitter
Artigos no CodeProject
Artigos no CodeProject 

Email Notifications

Archives

Abril 2010 - Posts

VS2010: Parallel Extensions - Tasks e Task(Of TResult)

O namespace System.Threading.Tasks trás alguns métodos que permitem realizar tarefas de forma assíncrona e de uma forma bastante simples de implementar. Dos novos métodos/tipos deste namespace, podem destacar-se 3:

Nota: Neste artigo serão focados apenas os dois primeiros.

Para o seguinte exemplo importar os seguinte namespaces:

Imports System.Threading
Imports System.Threading.Tasks

De uma forma geral uma Task funciona do seguinte modo:

        ' Define uma nova Task utilizando uma expressão Lambda
        ' que não será executada automáticamente após a declaração
        Dim t1 As New Task(Sub()
                               For x As Integer = 0 To 50
                                   Console.WriteLine("t1 - " & x.ToString())
                                   Thread.Sleep(200)
                               Next
                           End Sub)

        ' Inicia a Task
        t1.Start()
        Console.WriteLine("Tasks1 iniciada!")


        ' Define uma Action Delegate que irá encapsular um método
        Dim doSomething As New Action(Sub()
                                          For x As Integer = 0 To 50
                                              Console.WriteLine("t2 - " & x.ToString())
                                              Thread.Sleep(200)
                                          Next
                                      End Sub)

        ' Define uma nova Task e inicia-a
        Dim t2 As New Task(doSomething)
        t2.Start()
        Console.WriteLine("Tasks2 iniciada!")


        ' Aguarda que as tasks terminem antes de continuar
        Tasks.Task.WaitAll(New Task() {t1, t2})
        Console.WriteLine("Tasks terminadas!")

Este exemplo mostra como criar uma tarefa simples, usando uma Lambda Expression, e usando um Action Delegate. Mostra também como usar o método WaitAll() e com isso esperar que todas as tarefas terminem antes de avançar com o código.

Mas por uma questão de performance é aconselhado que se utilize o seguinte método para a criação de tarefas:

        ' Define uma nova Task, usando o método Factory.StartNew()
        Dim t3 As Task = Task.Factory.StartNew(doSomething)
        Console.WriteLine("Tasks3 iniciada!")

Este método cria uma tarefa e inicia-a imediatamente, não podendo no entanto ser usado em algumas situações (como por exemplo caso a tarefa necessite de ser executada posteriormente).


Mas todos estes exemplos não retornam valores! É muitas vezes necessário receber informação de uma determinada tarefa e nestes casos podemos utilizar o método Tasks.Task(Of TResult).

Eis um exemplo da sua utilização, que serve unicamente para mostrar como receber um resultado de uma tarefa, uma vez que não é um exemplo que necessite de ser executado desta forma.

        'Utiliza uma task para recolher o nome de todos os paises
        Dim countries = Task.Factory.StartNew(Of List(Of CultureInfo))(
                    Function()
                        Return CultureInfo.GetCultures(CultureTypes.AllCultures).ToList()
                    End Function)

        ' Espera que a task complete de modo a
        ' garantir que tem todos os resultados
        countries.Wait()

        ' Mostra todos os paises de língua Inglesa
        For Each item As CultureInfo In
                countries.Result.Where(Function(c) c.Name.Contains("en") And
                                           c.Name.Length > 2)
            Console.WriteLine(item.NativeName)
        Next

        Console.ReadKey()

Este exemplo, onde é necessário importar os namespaces System.Threading.Tasks e System.Globalization, recolhe a lista de todos os países, espera que a tarefa termine, e depois, usando Lambda Expressions, filtra todos os países de língua inglesa. O resultado, ou seja, o valor produzido e que será devolvido, é obtido através da propriedade Result.

Como a opções Option Infer está definida como On, não é necessário declarar a variável “countries” explicitando o tipo, uma vez que é inferido o tipo correcto(simplificando desta forma o código). Neste caso seria:

Dim countries As Task(Of List(Of CultureInfo)) = ...

Como podem ver nos exemplos mostrados, a criação de tarefas em paralelo é bastante simples e está bastante optimizada no Visual Studio 2010/.NET Framework 4.0.

Ebook Gratuito – Introducing Microsoft SQL Server 2008 R2
A Microsoft Press oferece um livro, em formato digital, de introdução ao SQL Server 2008 R2.

Este livro foi escrito por Ross Mistry e Stacia Misner.

É um livro dividido em 10 capítulos, com 216 páginas, que se pode agora descarregar gratuitamente. 

O livro está disponível para download nos seguintes formatos: XPS e PDF


Esta é a estrutura do livro:

PART I   Database Administration
CHAPTER 1   SQL Server 2008 R2 Editions and Enhancements
CHAPTER 2   Multi-Server Administration
CHAPTER 3   Data-Tier Applications
CHAPTER 4   High Availability and Virtualization Enhancements
CHAPTER 5   Consolidation and Monitoring

PART II   Business Intelligence Development
CHAPTER 6   Scalable Data Warehousing
CHAPTER 7   Master Data Services
CHAPTER 8   Complex Event Processing with StreamInsight
CHAPTER 9   Reporting Services Enhancements
CHAPTER 10   Self-Service Analysis with PowerPivot

A não perder!

Posted: 15-4-2010 1:30 por Jorge Paulino | with no comments
Filed under: ,
MSDN Magazine - Abril de 2010

Já está disponível a MSDN Magazine de Abril de 2010.

Nesta edição é possível ler diversos artigos como:

Entre outros artigos!

Destacar obviamente o artigo What’s New in Visual Basic 2010 que fala sobre as principais novidades do Visual Basic 2010, como Implicit Line Continuation, Statement Lambdas, Auto-Implemented Properties, Collection Initializers, Array Literals, Dynamic Language Runtime (DLR), etc (que já foram na maioria também referidas neste blog), e ainda a Coevolution entre o Visual Basic e o C#.

Um artigo também muito interessante de Better Coding with Visual Studio 2010 que refere algumas novidades do Visual Studio 2010, nomeadamente, Visual Studio IDE Improvements, Support for Parallel Programming, Web Updates, MVC Integration, SharePoint Integration, etc.

Posted: 2-4-2010 19:13 por Jorge Paulino | with no comments
Filed under: ,