- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
下面的示例在 throw 语句中引发 IndexOutOfRangeException,因为变量 i
超出了其限制(例如,当循环覆盖 0 和 1 时,为 2)。我期望这段代码创建 lambda block 0 和 1,它们各自将结果存储在相应的数组元素中。我注意到,通过设置断点,异步任务直到我调用 Task.WaitAll()
后才真正开始执行。来自 C# Programming Guide ,我知道编译器在循环退出后不遗余力地将 i
保持在范围内。
所以,我的问题是:
有人可以建议一种方法来实现我试图创建的效果,即每个异步任务应将其结果存储在数组中的不同槽中吗? Task.Run()
没有重载来提供参数(我用它来在循环中传递 i
),并且 lambda block 声明阻止了我的尝试无论如何都要声明参数。
有人可以提供理由,说明为什么 lambda 表达式在超出其声明 block 的范围后能够继续引用局部变量是理想的行为吗? C# 语言引用扭曲了“本地”声明的真正含义,以涵盖匿名函数和 lambda block 的提升,但这只会打开获取意外值的大门,如我的示例所示。
这是示例:
using System;
using System.Threading.Tasks;
namespace AsyncLifting
{
class Program
{
static void Main(string[] args)
{
const int numTasks = 2;
double[] taskResult = new double[numTasks];
Task<int>[] taskHandles = new Task<int>[numTasks];
for (int i = 0; i < numTasks; i++)
{
taskHandles[i] = Task.Run(async () =>
{
DateTime startTime = DateTime.UtcNow;
await Task.Delay(10);
try
{
taskResult[i] = (DateTime.UtcNow - startTime).TotalMilliseconds;
}
catch (Exception e) {
throw e; // IndexOutOfRange, i is 2
}
return i;
});
}
Task.WaitAll(taskHandles);
Console.WriteLine("Task waits:");
foreach (double tr in taskResult)
{
Console.WriteLine(" {0}ms.", tr);
}
}
}
}
最佳答案
委托(delegate)正在关闭变量——它不仅捕获当时的值,而且捕获整个变量。这有时会很有用。
无论如何,为了防止意外行为,只需创建一个新变量并在 block 内使用它:
for(int i = 0; i < n; i++) {
int index = i;
DoSomething(delegate() {
myArray[index] = /* something */;
});
}
关于c# - "safe"提升 lambda 表达式中引用的局部变量的规则是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20438184/
我偶然发现了 Wikipedia 上的线程安全文章;它区分了几个安全级别,尤其是: Thread safe: Implementation is guaranteed to be free of ra
当我启动 Rails 时,如何摆脱这个警告/错误。 在没有 :safe 选项的情况下调用“加载”——默认为安全模式。 => Booting Thin => Rails 3.2.13 applicati
当我启动 Rails 时,如何摆脱这个警告/错误。 在没有 :safe 选项的情况下调用“加载”——默认为安全模式。 => Booting Thin => Rails 3.2.13 applicati
我正在尝试使用 FCM 和 https://www.simplifiedcoding.net/firebase-cloud-messaging-android/ 上提供的教程向我的应用程序添加通知服务
我正在 VB.net 中寻找“安全”点符号。这样的事情是否存在——在 VB.NET 或任何语言中?我希望能够做的是,在使用 non-nullable 遗留对象时,解决如下问题: “如果有计划,如果有案
我在我的机器上使用 Windows 10 家庭单语言版,这是一个 64 位操作系统。 我已经安装了最新版本的 XAMPP,它在我的机器上安装了 PHP 7.2.7。 我是根据摘自 PHP Manual
我在 XmlDocument class documentation 中看到在 MSDN 上 Any public static ( Shared in Visual Basic) members o
例如,我经常想用 SELECT whatever FROM questions WHERE views * N + votes * M > answers AND NOT(answered) O
在DataStax收购Aurelius之后,自从Titan 1.0.0在2015年9月发布以来,自那时以来几乎没有提交过,所以我想知道在生产中使用TitanDB是否安全。谁能给我一些见识? 最佳答案
给定一个文件: dept4.abc.edu dept3.abc.edu dept2.abc.edu dept1.abc.edu 我知道如何使用以下命令获取从底部开始的第三行: tail -3 file
SELECT TO_NUMBER('*') FROM DUAL 这显然给了我一个异常(exception): ORA-01722: invalid number 有没有办法“跳过”它并获取 0 或 N
我不是在问这些是否真的是随机的。我只是想知道如果两个用户同时点击一个页面他们可以获得相同的随机数吗?我在想,如果我在多核服务器上运行它,我会因为同步或其他原因在很长一段时间内生成相同的随机数吗? pu
我有一个服务器存储来自客户端的数据。每个客户端都在自己的线程中工作,并且拥有一个数据对象。 这个数据对象是一个自定义类,让我们调用包含非特定数据的 Data.java,这可能是一些字节,但通常约为 1
我正在开发一个应用程序,其中我有一个包含 5000 行和 4 列的数据库。 problem_id (int) problem_no (string) problem_title (string) da
我有一个表,其中每行的字段数据都不完整,我想要修复。 这就是我的意思: mysql> CREATE TABLE test ( key INT a CHAR(1),
这个问题已经有答案了: How do JavaScript closures work? (86 个回答) 已关闭 6 年前。 所以,这个代码片段工作起来非常方便,但我对它的工作方式感到有点惊讶。 v
我想 compile C++ extensions to SQL Server , 来自文档 Safe mode: Run verifiably typesafe code; compiled wit
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。为了帮助澄清这个问题以便它可以重新打开,visit the help center。 关
这种互斥模式是否像我认为的那样安全?如果是这样,你怎么调用它? lock (_lock) { if (_flag) return; else _flag = true; } try {
假设您使用 EntityFramework 作为 ORM,所有这些都封装在一个单独的 DAL 类库中。 您在另一个“公共(public)”类库中有以下 POCO 对象,它在您的 DAL、SL 和表示层
我是一名优秀的程序员,十分优秀!