在更新UI元素时锁定并行Linq

本文关键字:锁定 并行 Linq 元素 更新 UI | 更新日期: 2023-09-27 18:11:54

我使用并行linq从文本文件加载链接列表。我检查每一行是否它是一个有效的链接(Uri)或不…如果它是一个有效的Uri,它被添加到一个列表框。我只是想知道我是否应该锁定列表框。项,同时添加链接。

这是我的代码。

if (openFile.ShowDialog() == DialogResult.OK)
{
    File.ReadLines(openFile.FileName).AsParallel().AsOrdered().ForAll(x =>
        {
            if (x.IsValidUri())
            {
                //lock(siteList.Items)  <-should I?
                siteList.Invoke(new Action<string>(s => siteList.Items.Add(s)), x);
            }
        });
}

在更新UI元素时锁定并行Linq

在这种情况下不需要锁定。使用Invoke()已经强制对Items集合的所有更改在GUI线程上同步发生。

正因为如此,使用AsParallel()并没有真正获得任何东西。你可以考虑使用BeginInvoke()代替,这可能会加快一些事情。这样,调用线程就不用等待调用完成。