2017-09-05 174 views
0

我目前正在運行一個Parallel.ForEach循環,其中包含一個while循環。C# - Parallel.ForEach循環在嵌套while循環停止後不會停止

那些將被運行直到一個條件取消他們。正如你將看到的while循環只有在有效的響應將userChanged布爾值設置爲true時纔會運行。

我的問題:loopState.Break();代碼似乎

不停止Parallel.ForEach循環。我究竟做錯了什麼?該userChanged布爾設置爲true

後,功能將跳回以下行:

Parallel.ForEach(dataGridView1.Rows.Cast<DataGridViewRow>(), (row, loopState) => 

,並重新啓動代碼。我讚賞任何形式的建議和幫助!

示例代碼:

private void function() 
{ 
    Parallel.ForEach(dataGridView1.Rows.Cast<DataGridViewRow>(), (row, loopState) => 
    { 
     try 
     { 
      // HttpWebRequest 

      bool userChanged = false; 

      while (!userChanged) 
      { 
       try 
       { 
        WebClient client1 = new WebClient 
        { 
         Proxy = null 
        }; 

        client1.Headers["Accept-Language"] = "en-us"; 

        if (client1.DownloadString("https://url.com/" + row.Cells[0].Value.ToString()).Contains("Sorry, that page doesn’t exist!")) 
        { 
         if (!userChanged) 
         { 
          // Request 

          if (/* condition is true */) 
          { 
           MessageBox.Show("Success", "Info", MessageBoxButtons.OK); 
           userChanged = true; 

           requestStream.Close(); 

           loopState.Break(); 
          } 
         } 
        } 
        else 
        { 
         // Call another function 
        } 
       } 
       catch (WebException ex) 
       { 
        MessageBox.Show(ex.Message); 
       } 
      } 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 

    }); 
} 
+0

[loopstate.Break(),loopState.Stop()和CancellationTokenSource.Cancel()]之間有什麼區別可能的副本(https://stackoverflow.com/questions/8818203/what-is-difference-between- loopstate-break-loopstate-stop-and-cancellationt) – Reniuz

+1

我沒有看到任何CPU密集型的事情發生在這裏。似乎並不適合Parallel.ForEach。你有沒有考慮過使用異步/等待Task.WhenAll?你所做的只是進行網絡通話 –

回答

2

嘗試使用loopState.Stop()

根據文檔:

調用歇方法通知操作,當前的一個迭代後不必須執行。但是,如果它們還沒有執行,那麼在當前執行之前的所有迭代都必須執行。並且不能保證當前迭代之後的迭代肯定不會執行。

MSDN

1

是的,取消必須是合作。

while (!userChanged && !loopState.ShouldExitCurrentIteration) 

我認爲你甚至可以不用userChanged這是隻有當地的國家。 ShouldExitCurrentIteration在此迭代與其他所有人之間共享。