[csharp]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace TaskParallel
{
class Program
{
static void Main(string[] args)
{
var t1 = Task.Factory.StartNew(() => Proceso1(1, 1500));
var t2 = Task.Factory.StartNew(() => Proceso1(2, 3000));
var t3 = Task.Factory.StartNew(() => Proceso1(3, 1000));

Console.WriteLine("Presione una tecla para salir");
Console.ReadKey();
}
static void Proceso1(int id, int sleepTime)
{
Console.WriteLine("Tarea {0} Iniciada", id);
Thread.Sleep(sleepTime);
Console.WriteLine("Tarea {0} Terminada", id);
}
static void Proceso2(int id, int sleepTime)
{
Console.WriteLine("Tarea {0} Iniciada del Proceso 2", id);
Thread.Sleep(sleepTime);
Console.WriteLine("Tarea {0} Terminada del Proceso 2", id);
}
}
}
[/csharp]

Ejecutar y esperar a que termine otra tarea.
[csharp]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace TaskParallel
{
class Program
{
static void Main(string[] args)
{
//Ejecutar y esperar a que termine otra tarea
var t1 = Task.Factory.StartNew(() => Proceso1(1,1500)).ContinueWith((prevTask)=> Proceso2(1,1000));
var t2 = Task.Factory.StartNew(() => Proceso1(2, 3000));
var t3 = Task.Factory.StartNew(() => Proceso1(3, 1000));

//Ejecutar y esperar que terminen todas las tareas
//var tasklist = new List<Task> { t1, t2, t3 };
//Task.WaitAll(tasklist.ToArray());

Console.WriteLine("Presione una tecla para salir");
Console.ReadKey();
}
static void Proceso1(int id, int sleepTime)
{
Console.WriteLine("Tarea {0} Iniciada", id);
Thread.Sleep(sleepTime);
Console.WriteLine("Tarea {0} Terminada", id);
}
static void Proceso2(int id, int sleepTime)
{
Console.WriteLine("Tarea {0} Iniciada del Proceso 2", id);
Thread.Sleep(sleepTime);
Console.WriteLine("Tarea {0} Terminada del Proceso 2", id);
}
}
}
[/csharp]