我想在 MultiThread Lambda 表达式中使用一些自由变量。
这是示例,
{
int a = 0;
Thread t = new Thread(() =>
{
SomeBlockingFunc(a);
});
t.Start();
}
我无法识别 Thread t Excute 何时结束,甚至变量范围都结束了。
即使在范围结束后,'int a' 是否有效?
谢谢你。
我想在 MultiThread Lambda 表达式中使用一些自由变量。
这是示例,
{
int a = 0;
Thread t = new Thread(() =>
{
SomeBlockingFunc(a);
});
t.Start();
}
我无法识别 Thread t Excute 何时结束,甚至变量范围都结束了。
即使在范围结束后,'int a' 是否有效?
谢谢你。
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
如你看到的: