如何在闭包中捕获ref变量?

时间:2018-01-10 19:34:12

标签: c# multithreading interlocked

我有这样的代码(简化):

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的相同引用,而不是“个别”复制的变量?我测试了它,它按预期工作,但我想确定。

  1. 使用显式ref counter进行互锁更改和阅读是否安全?

  2. 为什么Resharper提出这个古怪的建议将变量包装在单元素数组中?像这样:long[] counter = {0L}Interlocked.Increment(ref counter[0])。在帮助或修复某些内容时,您能提供用例吗?

  3. P.S。这个问题是由another my question引起的。

    注意: 我知道关闭是什么以及在常见情况下它是如何工作的。在将问题标记为重复之前,请阅读具体问题1和2.我没有在Internet和SO 中的多个“循环闭包”问题中找到这些问题的答案。

0 个答案:

没有答案