What is the difference between:
new Thread(new ThreadStart(SomeFunc))
and:
new Thread( delegate() { SomeFunc();} )
This code gives strange outputs on my computer:
public class A
{
int Num;
public A(int num)
{
Num = num;
}
public void DoObj(object obj)
{
Console.Write(Num);
}
public void Do()
{
Console.Write(Num);
}
}
/////// in void main()
for (int i = 0; i < 10; i++)
{
(new Thread(new ThreadStart((new A(i)).Do))).Start(); // Line 1
(new Thread(new ThreadStart(delegate() { (new A(i)).Do(); }))).Start(); // Line 2
(new Thread(delegate() { (new A(i)).Do(); })).Start(); // Line 3
}
If only Line 1 is executed the output is something like:
0 2 3 1 5 6 4 7 8 9
which is ok but if Line 2 or 3 is executed, output is:
3 3 3 5 5 7 7 9 9 10
There are some multiple numbers and a 10 which is quite strange that the loop is never run with the number 10. What is the trick behind these?
Thanks.
With the delegate, you are capturing
i.The difference is that with
new ThreadStart((new A(i)).Do)), you are creating a new instance ofAin theforloop withias a parameter. That means that at that point, the value ofiis taken and send to the constructor. The delegate you are sending is thus not of the creation ofA, but you are actually sending the a delegate of theDomethod of the instance ofAto the constructor.However, with
delegate() { (new A(i)).Do(); })(both of them), you are sending a reference ofito the thread.The thread then takes some time to start and meanwhile, the
forloop goes on. By the timeiis used in the delegate (i.e. the thread has started), theforloop has moved on to3and that’s what you see. The same goes for the second and third thread. The three threads are started but wait for the starting thread to complete some work. Then the created threads kick in (thread 1, 2 and 3) and they do their work. The Windows goes back to the thread with theforloop and goes on to start thread 4 and 5.Some reading material: