C# 当我在列表中添加文本文件的每一行时,我的UI被冻结
当我在列表中添加文本文件的每一行时,我的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
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请求
更好的措施是:
BeginInvoke(new MethodInvoker(a));
这将导致Windows消息泵中充斥着更新UI请求
更好的措施是:
你可能想考虑TPL数据流
这个文件有多大?在这里使用Surviv.Frutac可能不是一个好主意。你测量过(剖析)它的影响吗?IMHO没有足够的工作用于并行循环。除了那个共享列表和递增它(列表++)这不是一个好主意。我希望您使用的是线程安全的集合,如ConcurrentBag和not List for proxiesList。旁注:即使您创建了看起来正确的邮政编码,也请这样做。在创建示例时从实际代码中移除锁定是一个非常值得怀疑的想法。这次您很幸运地得到了答案,但在大多数情况下,讨论将是be完全偏离了正确的多线程代码(同样适用于发布代码中的SQL注入示例)。有问题的文件有多大?在这里使用Parallel.ForEach可能不是一个好主意。您测量(分析)了吗它的影响?我知道并行循环没有足够的工作。除了共享列表和增加它(列表++)这不是一个好主意。我希望您使用的是线程安全的集合,如ConcurrentBag和not List for proxiesList。旁注:即使您创建了看起来正确的邮政编码,也请这样做。在创建示例时从实际代码中移除锁定是一个非常值得怀疑的想法。这次您很幸运地得到了答案,但在大多数情况下,讨论将是be完全偏离了讨论正确的多线程代码的轨道(这同样适用于发布代码中的SQL注入示例)。