当我在列表中添加文本文件的每一行时,我的 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 请求淹没。

更好的做法是:

  1. 由于您所做的只是尝试在屏幕上显示 list 的数值,请考虑通过 Windows 表单计时器而不是每秒更新一次呼叫 BeginInvoke

  2. 如果必须从工作线程更新,不要BeginInvoke每一项,考虑分批更新。在这种情况下,也许更新每个 100

或者您可能需要考虑 TPL DataFlow