我有这个简单的逻辑:范围和匿名方法
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