使用/不使用delegate()启动线程

ali*_*hoo 14 c# multithreading delegates

有什么区别:

new Thread(new ThreadStart(SomeFunc))
Run Code Online (Sandbox Code Playgroud)

和:

new Thread( delegate() { SomeFunc();} )
Run Code Online (Sandbox Code Playgroud)

此代码在我的计算机上提供奇怪的输出:

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
}
Run Code Online (Sandbox Code Playgroud)

如果仅执行第1行,则输出类似于:

0 2 3 1 5 6 4 7 8 9

这是好的,但如果执行第2行或第3行,则输出为:

3 3 3 5 5 7 7 9 9 10

有一些多个数字和一个10很奇怪,循环永远不会以数字10运行.这些背后的诀窍是什么?

谢谢.

Pie*_*kel 15

有了代表,你正在捕捉i.

不同之处在于new ThreadStart((new A(i)).Do)),您Afor循环中创建一个新实例i作为参数.这意味着在那时,取值i并发送给构造函数.因此,您发送的委托不是创建A委托,而是实际上是将构造函数的Do方法的委托发送A给构造函数.

但是,对于delegate() { (new A(i)).Do(); })(两者都有),您正在向i线程发送引用.

然后线程需要一些时间来启动,同时for循环继续.i在委托中使用的时间(即线程已经启动),for循环已经移动到3,这就是你所看到的.第二和第三个线程也是如此.启动三个线程,但等待启动线程完成一些工作.然后创建的线程启动(线程1,2和3)并且他们完成他们的工作.Windows通过for循环返回到线程,然后继续启动线程4和5.

一些阅读材料: