我有這個簡單的邏輯:範圍和匿名方法
class Program
{
static void Main(string[] args)
{
using (TransactionScope ts = new TransactionScope())
{
System.Threading.Tasks.Parallel.Invoke(() =>
{
TransactionScope y = ts;
System.Diagnostics.Debug.WriteLine("Test");
},
() =>
{
System.Diagnostics.Debug.WriteLine("Test");
}
);
ts.Complete();
}
}
}
如果放在兩個Debug.WriteLine()
語句斷點,你會發現,當它打破第一,無論是y
和ts
被列爲調試器的當地人。但是,當它擊中後者中的斷點,ts
不被列爲本地,此外,加入ts
到監視窗口給The name 'ts' does not exist in the current context.
這個變量捕捉動作或這是一些其他的機制呢?我查閱了關於變量捕獲的書寫,我找不到任何明確指出變量只在使用時被捕獲的東西,但我假設它被稱爲變量捕獲,因爲它僅「捕獲」了什麼它需要並且不保留對可用的一切的引用。
我認爲在可能的並行操作完成之前,寫入的代碼可能有在調用'Complete'的危險。 – Kit
@Kit,從Parallel.Invoke文檔:'這種方法不會返回,直到每個提供的操作已完成,無論是否由於正常或異常終止發生完成。「 – Pete
哦,呵呵。我忘了這個。感謝您的提醒。 – Kit