2011-05-26 56 views
1

我保持現有的一些頁面和System.Threading跨位的代碼來了,我不知道該用它來做什麼。線程的奇怪場所?

(這是它的要點)

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

    int i = 0; 
    while (i < nodes.Count) 
    { 
     //do stuff with nodes[i] 

     //last line in while loop - this is where I'm confused 
     Math.Max(System.Threading.Interlocked.Increment(ref i), i - 1); 
    } 
} 

是否是有意義的做這樣的事情?而不是i應該增加ala i++而不是?我不是在多線程精通,但考慮到有這個頁面並沒有什麼真正的「特殊」發生(正在創建沒有額外的線程,等等)上沒有其他的線程代碼,似乎有點怪我。

感謝您的協助!

+0

Math.Max是無用太,整個事情可以改寫爲「爲(INT I = 0; I <節點。 Count; i ++){...}' – 2011-05-26 01:16:31

+0

@SelflessCoder你是對的,錯過了那個重構。 – 2011-05-26 01:17:52

+0

看起來像一個剪切和粘貼錯誤 – 2011-05-26 01:18:39

回答

7

你的直覺是正確的 - 代碼有點奇怪,可能會提交到The DailyWTF

我不知道原來開發商的動機,但沒有任何其他情況下,該方法似乎是線程安全的。您應該可以使用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 
    } 
} 
+0

啊每日跆拳道權前:沒有訪問過了一段時間,有過現在..... – 2011-05-26 01:22:23

+0

很大,這就是我想!謝謝 – kaveman 2011-05-26 01:26:31

4

i是一個局部變量(不與任何其他線程共享),所以簡單的i++是安全的。

所以,更換此:

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

與此

i++; 

或者作爲一個評論者指出的那樣,用一個簡單的forforeach循環替換!

1

除非您以某種方式(非常可疑)與其他線程共享本地i變量,否則i++也可以正常工作,而不需要聯鎖增量功能的開銷。

我看到這種情況發生的唯一方法是,如果你在循環體內經過i參照另一個函數,那麼這將分享。如果它只是在本地使用,那你很好。

+0

都能跟得上它的聲明有本地的'while'循環開始 – kaveman 2011-05-26 01:26:56