开发者

Foreach loop and tasks

开发者 https://www.devze.com 2023-01-01 13:05 出处:网络
I know from the codeing guidlines that I have read you should not do for (int i = 0; i < 5; i++) {

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();


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);
}
0

精彩评论

暂无评论...
验证码 换一张
取 消