C# 当我在列表中添加文本文件的每一行时,我的UI被冻结

C# 当我在列表中添加文本文件的每一行时,我的UI被冻结,c#,user-interface,freeze,C#,User Interface,Freeze,当我在列表中添加文本文件的每一行时,我的UI被冻结 这是我当前的代码: private void LoadProxies_Click(object sender, EventArgs e) { OpenFileDialog dialog = new OpenFileDialog(); dialog.Title = "Select your Proxies file"; dialog.Filter = "Text File|*.txt"; DialogResul

当我在列表中添加文本文件的每一行时,我的UI被冻结

这是我当前的代码:

private void LoadProxies_Click(object sender, EventArgs e)
{
    OpenFileDialog dialog = new OpenFileDialog();

    dialog.Title = "Select your Proxies file";
    dialog.Filter = "Text File|*.txt";

    DialogResult result = dialog.ShowDialog();

    if (result == DialogResult.OK)
    {
        int list = proxiesList.Count;

        Parallel.ForEach(File.ReadLines(file), line =>
        {
            if (line != null && line.Contains(":"))
            {
                proxiesList.Add(line);

                list++;

                InvokeUI(() => { Proxies.Text = list.ToString(); });
            }
        });
    }
}
这是InvokeUI方法:

private void InvokeUI(Action a)
{
    BeginInvoke(new MethodInvoker(a));
}
我尝试使用
Parallel.ForEach(File.ReadLines(File),line=>…
wait Task.Factory.StartNew(()=>…
),但它并没有解决我的问题

我怎么解决这个问题?谢谢

当我在列表中添加文本文件的每一行时,我的UI被冻结

代码的问题在于,它是一个相当紧密的循环,如果文件很大,则每秒会调用以下行很多次:

BeginInvoke(new MethodInvoker(a));
这将导致Windows消息泵中充斥着更新UI请求

更好的措施是:

>P>因为您所做的一切都是试图在屏幕上显示<代码>列表的数值,考虑通过Windows窗体定时器来更新一次,而不是调用<代码> SINULINKEX

>P>如果您必须从工作线程中更新,不要针对每个条目< <代码>初始调用> /代码>,考虑批处理更新。在这种情况下,可能更新每个<代码> 100 < /C> < /P> 。 P>您可以考虑TPL数据流

当我在列表中添加文本文件的每一行时,我的UI被冻结

代码的问题在于,它是一个相当紧密的循环,如果文件很大,则每秒会调用以下行很多次:

BeginInvoke(new MethodInvoker(a));
这将导致Windows消息泵中充斥着更新UI请求

更好的措施是:

>P>因为您所做的一切都是试图在屏幕上显示<代码>列表的数值,考虑通过Windows窗体定时器来更新一次,而不是调用<代码> SINULINKEX

>P>如果您必须从工作线程中更新,不要针对每个条目< <代码>初始调用> /代码>,考虑批处理更新。在这种情况下,可能更新每个<代码> 100 < /C> < /P> 。

你可能想考虑TPL数据流

这个文件有多大?在这里使用Surviv.Frutac可能不是一个好主意。你测量过(剖析)它的影响吗?IMHO没有足够的工作用于并行循环。除了那个共享列表和递增它(列表++)这不是一个好主意。我希望您使用的是线程安全的集合,如ConcurrentBag和not List for proxiesList。旁注:即使您创建了看起来正确的邮政编码,也请这样做。在创建示例时从实际代码中移除锁定是一个非常值得怀疑的想法。这次您很幸运地得到了答案,但在大多数情况下,讨论将是be完全偏离了正确的多线程代码(同样适用于发布代码中的SQL注入示例)。有问题的文件有多大?在这里使用Parallel.ForEach可能不是一个好主意。您测量(分析)了吗它的影响?我知道并行循环没有足够的工作。除了共享列表和增加它(列表++)这不是一个好主意。我希望您使用的是线程安全的集合,如ConcurrentBag和not List for proxiesList。旁注:即使您创建了看起来正确的邮政编码,也请这样做。在创建示例时从实际代码中移除锁定是一个非常值得怀疑的想法。这次您很幸运地得到了答案,但在大多数情况下,讨论将是be完全偏离了讨论正确的多线程代码的轨道(这同样适用于发布代码中的SQL注入示例)。