Skip to main content
 首页 » 编程设计

c#之更新 UI 元素时锁定 Parallel Linq

2024年02月06日28qlqwjy

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

这是我的代码。

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); 
            } 
        }); 
} 

请您参考如下方法:

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

尽管如此,使用 AsParallel() 并不能真正获得任何好处。您可能需要考虑改用 BeginInvoke(),这可能会加快速度。这样,调用线程就不会等待调用完成。