启动线程时的不同行为:ParameterizedThreadStart与Anonymous Delegate.为什么这有关系?

Mat*_*ato 5 c# multithreading closures

当我运行下面的代码时,输​​出是"DelegateDisplayIt",通常重复1-4次.我运行这段代码的次数大概是100次,而且输出的次数一直都不是"ParameterizedDisplayIt".因此,似乎创建并随后启动线程的方式会影响参数的传递方式.使用匿名委托创建新线程时,该参数是对原始变量的引用,但是当使用ParameterizedThreadStart委托创建时,该参数是一个全新的对象?我的假设是否正确?如果是这样,这似乎是线程构造函数的一个奇怪的副作用,不是吗?

static void Main()
{
    for (int i = 0; i < 10; i++)
    {
        bool flag = false;

        new Thread(delegate() { DelegateDisplayIt(flag); }).Start();

        var parameterizedThread = new Thread(ParameterizedDisplayIt);
        parameterizedThread.Start(flag);

        flag = true;
    }

    Console.ReadKey();
}

private static void DelegateDisplayIt(object flag)
{
    if ((bool)flag)
        Console.WriteLine("DelegateDisplayIt");
}

private static void ParameterizedDisplayIt(object flag)
{
    if ((bool)flag)
        Console.WriteLine("ParameterizedDisplayIt");
}
Run Code Online (Sandbox Code Playgroud)

Jef*_*nal 5

你的假设是正确的.该语句parameterizedThread.Start(flag)在调用时复制标志变量.

相比之下,匿名委托在闭包中捕获原始变量.在委托执行DelegateDisplayIt方法之前,不会复制变量.此时,该值可能为true false,具体取决于原始线程在调用循环中的位置.