C# 穿线的奇怪地方?

C# 穿线的奇怪地方?,c#,asp.net,multithreading,C#,Asp.net,Multithreading,我正在维护一些现有页面,遇到了一些来自System.Threading的代码,我不确定该如何处理 (这是本文的要点) 受保护的无效页面加载(对象发送方,事件参数e) { XmlDocument xmlDoc=GetFromCMS(); var nodes=xmlDoc.SelectNodes(“/xpath/to/nodes”); int i=0; 而(i

我正在维护一些现有页面,遇到了一些来自
System.Threading
的代码,我不确定该如何处理

(这是本文的要点)

受保护的无效页面加载(对象发送方,事件参数e)
{
XmlDocument xmlDoc=GetFromCMS();
var nodes=xmlDoc.SelectNodes(“/xpath/to/nodes”);
int i=0;
而(i
这样做有意义吗?不能将
i
改为递增
i++
?我并不精通多线程,但考虑到本页上没有其他线程代码,也没有真正“特殊”的事情发生(没有创建额外的线程等),我觉得有点奇怪


谢谢你的帮助

i
是一个局部变量(不与任何其他线程共享),因此简单的
i++
是安全的

因此,替换这个:

Math.Max(System.Threading.Interlocked.Increment(ref i), i - 1);
用这个

i++;

或者,正如一位评论者所指出的,用一个简单的
for
foreach
循环代替

i
是一个局部变量(不与任何其他线程共享),因此简单的
i++
是安全的

因此,替换这个:

Math.Max(System.Threading.Interlocked.Increment(ref i), i - 1);
用这个

i++;

或者,正如一位评论者所指出的,用一个简单的
for
foreach
循环代替

除非您以某种方式(非常可疑)与其他线程共享本地
i
变量,
i++
也可以正常工作,而不需要联锁增量函数的开销


我能看到这种情况发生的唯一方法是在循环体中通过引用将
I
传递给另一个函数,然后该函数将共享它。如果只是在本地使用,就可以了。

除非您以某种方式(非常可疑)与其他线程共享本地
i
变量,
i++
也可以正常工作,而不需要联锁增量函数的开销


我能看到这种情况发生的唯一方法是在循环体中通过引用将
I
传递给另一个函数,然后该函数将共享它。如果只是在本地使用,您就可以了。

您的直觉是正确的-代码有点奇怪,可能会很好地服从您的要求

我不确定开发人员最初的动机,但如果没有任何其他上下文,该方法似乎是线程安全的。您应该能够使用
i++增加
i
无风险

更好的是,您可以通过重写为
foreach
来消除
i

protected void Page_Load(object sender, EventArgs e)
{
    XmlDocument xmlDoc = GetFromCMS();
    var nodes = xmlDoc.SelectNodes("/xpath/to/nodes");

    foreach(var node in nodes)
    {
        //do stuff with node
    }
}

您的直觉是正确的——代码有点奇怪,可能会很好地服从您的要求

我不确定开发人员最初的动机,但如果没有任何其他上下文,该方法似乎是线程安全的。您应该能够使用
i++增加
i
无风险

更好的是,您可以通过重写为
foreach
来消除
i

protected void Page_Load(object sender, EventArgs e)
{
    XmlDocument xmlDoc = GetFromCMS();
    var nodes = xmlDoc.SelectNodes("/xpath/to/nodes");

    foreach(var node in nodes)
    {
        //do stuff with node
    }
}

Math.Max也没用,整个东西可以重写为'for(int i=0;iwhile
循环开始之前不在本地声明,就在
while
循环开始之前