我有这样的代码(简化):
long counter = 0L;
var t = Task.Run(async () =>
{
Interlocked.Increment(ref counter); // Resharper: "Access to modified closure"
await Task.Delay(500); // some work
});
// ...
t.Wait();
// ...
Interlocked.Decrement(ref counter);
counter
变量用于控制正在进行的某事的总数。
在lambda(以及它之外)中,变量仅以ref
引用。编译器如何处理这样的捕获?是否保证所有代表(如果有的话)都会获得counter
的相同引用,而不是“个别”复制的变量?我测试了它,它按预期工作,但我想确定。
使用显式ref counter
进行互锁更改和阅读是否安全?
为什么Resharper提出这个古怪的建议将变量包装在单元素数组中?像这样:long[] counter = {0L}
,Interlocked.Increment(ref counter[0])
。在帮助或修复某些内容时,您能提供用例吗?
P.S。这个问题是由another my question引起的。
注意: 我知道关闭是什么以及在常见情况下它是如何工作的。在将问题标记为重复之前,请阅读具体问题1和2.我没有在Internet和SO 中的多个“循环闭包”问题中找到这些问题的答案。