views:

32

answers:

1

I know from the codeing guidlines that I have read you should not do

for (int i = 0; i < 5; i++) 
{ 
    Task.Factory.StartNew(() => Console.WriteLine(i));
}
Console.ReadLine();

as it will write 5 5's, I understand that and I think i understand why it is happening. I know the solution is just to do

for (int i = 0; i < 5; i++) 
{ 
    int localI = i;
    Task.Factory.StartNew(() => Console.WriteLine(localI));
}
Console.ReadLine();

However is something like this ok to do?

foreach (MyClass myClass in myClassList) 
{ 
    Task.Factory.StartNew(() => myClass.DoAction());
}
Console.ReadLine();

Or do I need to do the same thing I did in the for loop.

foreach (MyClass myClass in myClassList) 
{ 
    MyClass localMyClass = myClass;
    Task.Factory.StartNew(() => localMyClass.DoAction());
}
Console.ReadLine();
+3  A: 

It's absolutely the same problem with foreach. The following:

foreach (MyClass myClass in myClassList) 
{ 
    Task.Factory.StartNew(() => myClass.DoAction());
}

will most probably always invoke the DoAction method on the last element of the list, which could be fixed like this:

foreach (MyClass myClass in myClassList) 
{ 
    MyClass localMyClass = myClass;
    Task.Factory.StartNew(() => localMyClass.DoAction());
}

But instead of relying on local variables I would recommend you the following:

for (int i = 0; i < 5; i++)
{
    Task.Factory.StartNew(localI => Console.WriteLine(localI), i);
}
Darin Dimitrov
I don't really care about the for case, I just copied the code from http://download.microsoft.com/download/B/C/F/BCFD4868-1354-45E3-B71B-B851CD78733D/ParallelProgramsinNET4_CodingGuidelines.pdf I really just want to know about the foreach case. Also my code is a little more complicated than what I posted. look at the previous revision to see what I am really doing.
Scott Chamberlain
It's the same thing with `foreach`.
Darin Dimitrov