当我在列表中添加文本文件的每一行时,我的 UI 被冻结了
My UI get frozen while I add each line of a text file in a List
当我在列表中添加文本文件的每一行时,我的 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 => ...
和 await Task.Factory.StartNew(() => ...
,但它没有解决我的问题。
我该如何解决这个问题?谢谢。
My UI get frozen while I add each line of a text file in a List
你的代码的问题是它是一个相当紧凑的循环,如果文件很大,每秒将调用以下行很多次:
BeginInvoke(new MethodInvoker(a));
这将导致 Windows 消息泵被更新 UI 请求淹没。
更好的做法是:
由于您所做的只是尝试在屏幕上显示 list
的数值,请考虑通过 Windows 表单计时器而不是每秒更新一次呼叫 BeginInvoke
如果必须从工作线程更新,不要BeginInvoke
每一项,考虑分批更新。在这种情况下,也许更新每个 100
或者您可能需要考虑 TPL DataFlow
当我在列表中添加文本文件的每一行时,我的 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 => ...
和 await Task.Factory.StartNew(() => ...
,但它没有解决我的问题。
我该如何解决这个问题?谢谢。
My UI get frozen while I add each line of a text file in a List
你的代码的问题是它是一个相当紧凑的循环,如果文件很大,每秒将调用以下行很多次:
BeginInvoke(new MethodInvoker(a));
这将导致 Windows 消息泵被更新 UI 请求淹没。
更好的做法是:
由于您所做的只是尝试在屏幕上显示
list
的数值,请考虑通过 Windows 表单计时器而不是每秒更新一次呼叫BeginInvoke
如果必须从工作线程更新,不要
BeginInvoke
每一项,考虑分批更新。在这种情况下,也许更新每个100
或者您可能需要考虑 TPL DataFlow