我可以在 Parallel Foreach 循环中使用局部变量吗(不会无意中重写以前的值)
Can I use local variables inside a Parallel Foreach loop (without unintentionally rewriting the previous value)
所以我试图一次处理一行数据表中的记录。我是多线程环境的新手,我被要求使用 Parallel.Foreach 循环。我想知道在并行执行模式下如何处理局部变量。以下是我的代码。
Parallel.ForEach(dtReportData.Tables[0].AsEnumerable(), drow =>
{
string strType = drow["type"];
//Based on this type, I am executing logic from a switch case.
});
现在。我想知道我是否可以在循环内为变量声明和赋值。
例如,假设有 2 个线程 运行 并行。
线程 1 获取了一条记录,假设获取的值是 "Type1" 并存储到 strType 中。
现在,我希望我的代码执行类型 "Type1" 的逻辑(假设我们已经为它编写了一个 switch case)
但是,我们假设在线程 1 开始执行逻辑之前,线程 2 开始发挥作用。线程 2 将值 "Type2" 分配给 strType。
现在,当线程 1 转到我的 Switch 块时,它将保持什么值?会是 "Type1" 还是 "Type2"。
请注意,我不是在 Foreach 循环外全局声明 String 变量的值,它在循环内,我相信每次都会创建一个新实例。
变量 strType
是此 lambda 调用的本地变量,其他线程无法看到或修改它。它的值存储在当前线程的栈中。每个线程都有自己的堆栈,大小为.
作为旁注,请注意一般的 ADO.NET class es,特别是 DataTable
class 不是线程安全的。如果您尝试从多个线程并行改变它们,它们的内部状态可能会损坏,并且它们的行为将变得不确定。
所以我试图一次处理一行数据表中的记录。我是多线程环境的新手,我被要求使用 Parallel.Foreach 循环。我想知道在并行执行模式下如何处理局部变量。以下是我的代码。
Parallel.ForEach(dtReportData.Tables[0].AsEnumerable(), drow =>
{
string strType = drow["type"];
//Based on this type, I am executing logic from a switch case.
});
现在。我想知道我是否可以在循环内为变量声明和赋值。 例如,假设有 2 个线程 运行 并行。
线程 1 获取了一条记录,假设获取的值是 "Type1" 并存储到 strType 中。 现在,我希望我的代码执行类型 "Type1" 的逻辑(假设我们已经为它编写了一个 switch case)
但是,我们假设在线程 1 开始执行逻辑之前,线程 2 开始发挥作用。线程 2 将值 "Type2" 分配给 strType。
现在,当线程 1 转到我的 Switch 块时,它将保持什么值?会是 "Type1" 还是 "Type2"。
请注意,我不是在 Foreach 循环外全局声明 String 变量的值,它在循环内,我相信每次都会创建一个新实例。
变量 strType
是此 lambda 调用的本地变量,其他线程无法看到或修改它。它的值存储在当前线程的栈中。每个线程都有自己的堆栈,大小为
作为旁注,请注意一般的 ADO.NET class es,特别是 DataTable
class 不是线程安全的。如果您尝试从多个线程并行改变它们,它们的内部状态可能会损坏,并且它们的行为将变得不确定。