首次使用Parallel.ForEach UI仍处于锁定状态

问题描述 投票:0回答:1

[我想在这里做的是循环遍历URL的列表视图,检查源代码是否包含字符串,如果确实包含,则使用YESNO更新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锁定,或者我弄错了,可以提供任何帮助。

c# .net asynchronous task-parallel-library
1个回答
-1
投票

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) {
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.