[我想在这里做的是循环遍历URL的列表视图,检查源代码是否包含字符串,如果确实包含,则使用YES
或NO
更新UI列表视图。
我忘记了Parallel.ForEach
方法,所以决定尝试一下(我什至不确定这是否是最好的解决方案)
Parallel.ForEach(listViewMain.Items.Cast<ListViewItem>(), row =>
{
try
{
string html = Helpers.GetRequest(row.Text);
if (html.Contains(txtBoxFind.Text))
{
row.SubItems[3].Text = "YES";
}
else
{
row.SubItems[3].Text = "NO";
}
} catch(Exception) {
}
});
在没有Parallel.ForEach
的情况下,此过程非常简单,但UI仍处于锁定状态,我是否正确实施了? Helpers.GetRequest
只是返回要检查的原始HTML,我认为使用Parallel.ForEach
会在处理过程中停止UI锁定,或者我弄错了,可以提供任何帮助。
Parallel.ForEach
正在UI线程(当前线程)上执行,并且在非阻塞UI的情况下不会为您提供更多性能。如果要避免UI块,可以尝试使用async
方法作为示例:
Task.Run(() => CheckItems());
鉴于您可以实现GetRequest
方法的异步版本,您可以实现一个异步方法来进行此操作,例如:
public async Task CheckItems()
{
foreach (var row in listViewMain.Items.Cast<ListViewItem>())
{
try
{
string html = await Helpers.GetRequestAsync(row.Text);
if (html.Contains(txtBoxFind.Text))
{
row.SubItems[3].Text = "YES";
}
else
{
row.SubItems[3].Text = "NO";
}
} catch(Exception ex) {
}
}
}