Sorry if this was asked before. I have two almost identical functions sync and async:
private static void runLong(int id)
{
Console.WriteLine("starting " + id );
Thread.Sleep(myRandom.Next(200,1000));
Console.WriteLine("-exiting " + id);
}
private static async Task runLongAsync(int id)
{
Console.WriteLine("starting " + id );
await Task.Run(()=>Thread.Sleep(myRandom.Next(200,1000)));
Console.WriteLine("-exiting " + id );
}
I call them in a very similar way:
public static void run()
{
run().Wait();
runAsync().Wait();
}
private static async Task run()
{
List<Task> runningTasks = new List<Task>();
for (int i = 0; i < 5; i++)
{
runningTasks.Add(Task.Run(() => runLong(i)));
}
await Task.WhenAll(runningTasks);
}
private static async Task runAsync()
{
List<Task> runningTasks = new List<Task>();
for (int i = 0; i < 5; i++)
{
runningTasks.Add(runLongAsync(i));
}
await Task.WhenAll(runningTasks);
}
However result is different: Calling synchronous function asynchronously
- starting 5
- starting 5
- starting 5
- starting 5
- starting 5
- exiting 5
- exiting 5
- exiting 5
- exiting 5
- exiting 5
Calling asynchronous function:
- starting 0
- starting 1
- starting 2
- starting 3
- starting 4
- exiting 0
- exiting 3
- exiting 2
- exiting 1
- exiting 4
I.E. in first case parameters are overwritten but in the second- they are not. What's going on here?
Edit1: Yes I found a quick fix int copy = i; But I'd like to understand what's actually going on here and why these two functions behave differently.
Edit2: Articles referred by @Servy explain why for and foreach loops behave differently, in my case I have two for loops that behave differently