我目前正在运行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);
}
});
}
答案 0 :(得分:2)
尝试使用loopState.Stop()
根据文件:
调用Break方法通知for操作,当前迭代之后的迭代不必执行。但是,如果还没有,那么当前迭代之前的所有迭代仍然必须执行。并且无法保证当前迭代之后的迭代肯定不会执行。
答案 1 :(得分:1)
是的,取消必须合作。
while (!userChanged && !loopState.ShouldExitCurrentIteration)
我认为你甚至可以没有只有当地国家的userChanged
。 ShouldExitCurrentIteration在此迭代和所有其他迭代之间共享。