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.
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!
| 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.