Tasks in parallel
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Threading.Tasks; using System.Threading; using System.IO; using Microsoft.SqlServer.Dts.Runtime; struct Response { public bool DTSResult { get; set; } public string Message { get; set; } } public partial class Default3 : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } Response ExecuteWorkA() { bool flagA = false; try { //Thread.Sleep(16000); string pkgLocation; Package pkg; Application app; DTSExecResult pkgResults; pkgLocation = @"C:\Users\xxxxxxxxxx\Documents\Visual Studio 2008\projects\Integration Services Project1\Integration Services Project1\Package.dtsx"; app = new Application(); pkg = app.LoadPackage(pkgLocation, null); pkgResults = pkg.Execute(); flagA = pkgResults == DTSExecResult.Success; //throw new Exception("err"); } catch (Exception ex) { flagA = false; } return new Response { DTSResult = flagA }; } Response ExecuteWorkB() { bool flagB = false; try { Thread.Sleep(14000); flagB = true; //throw new Exception("error"); } catch (Exception ex) { flagB = false; } return new Response { DTSResult = flagB }; } Response ExecuteWorkC() { bool flagC = false; Thread.Sleep(17000); flagC = true; return new Response { DTSResult = flagC}; } protected void Button1_Click(object sender, EventArgs e) { List<Func<Response>> lst = new List<Func<Response>>(); lst.Add(ExecuteWorkA); lst.Add(ExecuteWorkB); lst.Add(ExecuteWorkC); List<Response> result = new List<Response>(); Action act = () => { Parallel.ForEach(lst, (func) => { result.Add(func()); }); bool isFailed = false; foreach (Response item in result) { if (!item.DTSResult) { isFailed = true; break; } } if(result.Count > 0 ) File.AppendAllText(@"D:\Temp\log.txt", string.Format("{0} {1} ", DateTime.Now, isFailed ? "Failed!" : "Suceed!")); }; act.BeginInvoke(null, null); //for better, have callback method... } }