Example code for using Task Parallel Library and PLINQ with Visual Studio 2010 RTM
Posted: (EET/GMT+2)
Parallel programming is an important part of the new feature set in Visual Studio 2010 / .NET Framework 4.0. Since Visual Studio 2010 became available in RTM version earlier this week, it's a good time to share code that uses Task Parallel Library (TPL) and PLINQ (Parallel LINQ) and make sure your code works with the RTM version of .NET 4.0.
Here's some sample code on how to create tasks with the Task class:
using System.Threading.Tasks;
...
// *** TASK PARALLEL LIBRARY DEMOS ***
private void button1_Click(object sender, EventArgs e)
{
Task task = new Task(DoWork);
}
private void button2_Click(object sender, EventArgs e)
{
object state = "ABC";
Task task = new Task(DoWork2, state);
}
private void button3_Click(object sender, EventArgs e)
{
int value = 123;
Task task = new Task(Calculate, (object)value);
task.Start();
task.Wait();
int timesTwo = task.Result;
}
private void DoWork()
{
// do work here
}
private void DoWork2(object state)
{
// do work here
}
private int Calculate(object state)
{
// do work here
return (int)state * 2;
}
Then some demos using Parallel LINQ. The button6_click event demonstrates calculating prime numbers with multiple threads:
private void button4_Click(object sender, EventArgs e)
{
int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int[] sums = new int[numbers.Length];
// classic for loop implementation
for (int i = 0; i < numbers.Length; i++)
{
sums[i] = numbers[i] + numbers[i];
}
// parallel for loop implementation
Parallel.For(0, numbers.Length, (i) =>
{
sums[i] = numbers[i] + numbers[i];
});
}
private void button5_Click(object sender, EventArgs e)
{
// start two tasks in parallel
Parallel.Invoke(
DoWork,
() => DoWork2("ABC"));
}
private void button6_Click(object sender, EventArgs e)
{
IEnumerable numbers = Enumerable.Range(1, 10000000);
DateTime startTime = DateTime.Now;
bool[] results = numbers.AsParallel().Select(
num => IsPrime(num)).ToArray();
DateTime endTime = DateTime.Now;
MessageBox.Show("Operation took " +
(endTime - startTime).TotalSeconds + " seconds.");
}
private bool IsPrime(int input)
{
int sqrt = 1 + (int)System.Math.Sqrt(input);
for (int i = 2; i < sqrt; i++)
{
if (input % i == 0)
return false;
}
return true;
}
Enjoy!