using System.Threading.Tasks;
using System.Collections;
using System.Collections.Generic;
public static void Main()
AccessForLoopVariables();
AccessForEachVariables();
private static void AccessForLoopVariables()
Task[] taskArray = new Task[10];
for(int i = 0; i < 10; i++)
taskArray[i] = Task.Factory.StartNew(() => Console.WriteLine($"Data: {i}"));
private static void AccessForEachVariables()
List<Task> tasks = new List<Task>();
string[] urls = Enumerable.Range(1, 10).Select(x => "Url-" + x.ToString()).ToArray();
tasks.Add(Task.Factory.StartNew(() => Console.WriteLine($"Data: {url}")));
Task.WaitAll(tasks.ToArray());
private static void PassCustomData()
Task[] taskArray = new Task[10];
for(int i = 0; i < 10; i++)
taskArray[i] = Task.Factory.StartNew((Object obj) => {
var data = obj as CustomData;
data.ThreadId = Thread.CurrentThread.ManagedThreadId;
}, new CustomData { Index = i});
foreach (var task in taskArray)
var data = task.AsyncState as CustomData;
Console.WriteLine($"ThreadId {data.ThreadId} Index: {data.Index}");