【问题标题】:Don't let GUI freeze with parallel.for due to the reading of a big array不要因为读取大数组而让 GUI 冻结为 parallel.for
【发布时间】:2018-07-29 22:48:48
【问题描述】:

我正在尝试从文本框中获取一个大字符串文本数组,其中行为string[]

它可以工作,但问题是在输入大量数据时,程序的 GUI 在处理整个数组大小时会冻结片刻(与不让 GUI 滞后的异步函数不同)。避免冻结?我正在尝试使用并行,但结果似乎相同......我该如何解决这个问题?

string[] text = textBox.Lines;

if (textBox.Lines.Length > 0)
{
    Parallel.For(0, textBox.Lines.Length, x =>
    {
        text[x] = textBox.Lines[x];
    });
}

已修复:

string[] text = textBox.Lines;

if (text.Length == 0)
{
    MessageBox.Show("Insert lines", "Error");
}

【问题讨论】:

  • 你试过用string text[] = textBox.Lines;替换所有代码吗?
  • 天哪,你是对的,没有必要循环......谢谢大家帮助我
  • textBox.Lines 中有足够的行数来使Parallel.For 值得使用是非常不可能的。创建/使用线程有很多开销。您需要占用大量 CPU 的代码才能使其物有所值。

标签: c# parallel-processing parallel-for


【解决方案1】:

问题是您在循环中使用了TextBox.Lines 属性。您根本不需要这样做,因为 Lines 属性在每次访问时都会重新创建一个新的字符串数组。只需获取 Lines 属性,就完成了。您不需要在 UI 线程上逐行复制它。

 string[] text = textBox.Lines; //Done.

要验证它是否像我描述的那样工作,请查看源代码:https://referencesource.microsoft.com/#system.windows.forms/winforms/managed/system/winforms/TextBoxBase.cs,37cabfde1449b18f,references

【讨论】:

    猜你喜欢
    • 2011-02-09
    • 2018-05-25
    • 2014-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-31
    • 1970-01-01
    相关资源
    最近更新 更多