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
循环开始之前