0

我想在 MultiThread Lambda 表达式中使用一些自由变量。

这是示例,

{
   int a = 0;
   Thread t = new Thread(() => 
   {
        SomeBlockingFunc(a);
   });
   t.Start();
}

我无法识别 Thread t Excute 何时结束,甚至变量范围都结束了。

即使在范围结束后,'int a' 是否有效?

谢谢你。

4

1 回答 1

4

lambda 表达式捕获a变量。此代码完全有效。

从 C# 6 规范草案第 11.16.6.2 节

当一个外部变量被匿名函数引用时,该外部变量被称为已被匿名函数捕获。通常,局部变量的生命周期仅限于执行与其关联的块或语句(第 9.2.8 节)。但是,捕获的外部变量的生命周期至少会延长,直到从匿名函数创建的委托或表达式树符合垃圾回收的条件。

区分变量的范围(这只是标识符引用该变量的代码部分)和变量的生命周期很重要。

还值得注意的是,它确实仍然是一个变量。多个委托可能会捕获相同的变量。考虑这段代码:

using System;

int value = 0;
Action a = () =>
{
    Console.WriteLine($"In first action; value={value}");
    value++;
};
Action b = () =>
{
    Console.WriteLine($"In second action; value={value}");
    value++;
};

a();
a();
b();
a();

这个的输出是:

In first action; value=0
In first action; value=1
In second action; value=2
In first action; value=3

如你看到的:

  • 这两个动作捕获了相同的变量
  • 两个动作都可以看到在每个动作中对变量值所做的更改
于 2022-02-16T06:58:18.990 回答