C# - Parallel.ForEach循环在嵌套while循环停止后不会停止

时间:2017-09-05 14:36:44

标签: c# loops

我目前正在运行Parallel.ForEach循环,其中包含while循环。

这些将被运行,直到一个条件取消它们。正如您将看到,while循环仅在有效响应将userChanged bool设置为true时才会运行。

我的问题:

loopState.Break();代码似乎没有停止Parallel.ForEach循环。我做错了什么?

userChanged bool设置为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);
        }

    });
}

2 个答案:

答案 0 :(得分:2)

尝试使用loopState.Stop()

根据文件:

  

调用Break方法通知for操作,当前迭代之后的迭代不必执行。但是,如果还没有,那么当前迭代之前的所有迭代仍然必须执行。并且无法保证当前迭代之后的迭代肯定不会执行。

MSDN

答案 1 :(得分:1)

是的,取消必须合作。

while (!userChanged && !loopState.ShouldExitCurrentIteration)

我认为你甚至可以没有只有当地国家的userChanged。 ShouldExitCurrentIteration在此迭代和所有其他迭代之间共享。