c# - 为什么值类型和引用类型在任务循环中表现不同?

标签 c# .net multithreading task-parallel-library task

我有这两个看似相同的循环的实现:

List<Type> types = ...

tasks = new Task<List<TypeInfo>>[types.Count];
for (Int32 i = 0; i < types.Count; i++)
{
    tasks[i] = Task<List<TypeInfo>>.Run(() => GetBaseTypeList(types[i]));
}
Task.WaitAll(tasks);

当我这样做时,我可能会得到一个 IndexOutOfRangeException,因为当异步任务启动时,i 现在可能有任何值。

到目前为止,我确实了解其背后的机制。

我不明白的是,为什么会这样:

List<Type> types = ...

tasks = new Task<List<TypeInfo>>[types.Count];
for (Int32 i = 0; i < types.Count; i++)
{
    Type t;

    //do not put the indexer types[i] directly into the call because when the task is executed, i can have any value (delayed execution!).
    t = types[i];
    tasks[i] = Task<List<TypeInfo>>.Run(() => GetBaseTypeList(t));
}
Task.WaitAll(tasks);

t 在每个循环中也会发生变化,但为什么所有任务都使用在该循环迭代期间分配的 t 完美执行?

最佳答案

t 在循环中没有改变。

tfor 循环范围内的局部变量,这基本上意味着它是每次迭代的"new" t .

另一方面,

i 存在于 for 循环的所有迭代中(否则每次迭代都会为 0),超过这个值就是为什么它在每次迭代中都发生变化并且不应该关闭。

例如,在 Type t; 之后的第二次迭代中,t 的值为 null 而不是上一次迭代的类型。

关于c# - 为什么值类型和引用类型在任务循环中表现不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27427933/

相关文章:

Java多线程: Calling a method on an object that extends Thread

在不同的线程上创建一个计时器 - 没有回调函数(C,Windows)

c# - 如何显示带有复选框的 MessageBox?

c# - Entity Framework Code First - 更改表名

c# - 如何获取 GridView 上 DataSet.DataTable 的总计?

c# - 如何知道WINDOWS操作系统为独立存储提供的存储空间?

php - MySqlConnection 打开失败,即使模拟也拒绝访问

java - Android-当我尝试在文本框中显示某些内容时崩溃

c# - CommandParameter MultiBinding 返回包含 null 元素的数组

c# - 托管位于插件 DLL 中的 WPF 页面