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

标签 c# winforms linq parallel-processing locking

我正在使用并行 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(),这可能会加快速度。这样,调用线程就不会等待调用完成。

关于c# - 更新 UI 元素时锁定 Parallel Linq,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24635360/

相关文章:

c# - 使用 ForEach 将随机值分配给数组不起作用,但是 for 语句可以正常工作吗?

c# - 无法在设计器中加载文件或程序集 System.Componentmodel.Annotations 4.2.0.0

sql - 基于引用记录的自定义排序

c# - 带有长 where 子句的 Linq

c# - Windows 窗体应用程序不会初始化

sql - LINQ to SQL - 选择文本之类的字符串数组

c# - 如何使用 MultiSelection ="true"让默认值出现在 MudBlazor MudSelect 中?

c# - 是否有适用于 Android 平板电脑的 c# IDE?

c# - MS2015 中的 MvcBuildViews 需要很长时间

c# - 我如何才能等到表单句柄创建后再使用其组件?