我想在 MultiThread Lambda 運算式中使用一些自由變數。
這是示例,
{
int a = 0;
Thread t = new Thread(() =>
{
SomeBlockingFunc(a);
});
t.Start();
}
我無法識別 Thread t Excute 何時結束,甚至變數范圍都結束了。
即使在范圍結束后,'int a' 是否有效?
謝謝你。
uj5u.com熱心網友回復:
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
如你看到的:
- 這兩個動作捕獲了相同的變數
- 兩個動作都可以看到在每個動作中對變數值所做的更改
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/424565.html
下一篇:讓我發瘋的Pthread資料競賽
