不要让 GUI 由于读取大数组而冻结 parallel.for
Don't let GUI freeze with parallel.for due to the reading of a big array
我正在尝试从行为 string[]
.
的文本框中获取一个大字符串文本数组
它可以工作,但问题是当输入大量数据时,程序的 GUI 在处理整个数组大小时会冻结片刻(不同于不让 GUI 滞后的异步函数).为了避免冻结?我正在尝试使用 parallel for 但结果似乎是一样的...我该如何解决这个问题?
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");
}
问题是您在循环中使用了 TextBox.Lines
属性。您根本不需要这样做,因为 Lines 属性 每次访问时都会重新创建一个新的字符串数组。只需获取行 属性,即可完成。您不需要在 UI 线程上逐行复制它。
string[] text = textBox.Lines; //Done.
要验证它是否像我描述的那样工作,请查看来源:https://referencesource.microsoft.com/#system.windows.forms/winforms/managed/system/winforms/TextBoxBase.cs,37cabfde1449b18f,references
我正在尝试从行为 string[]
.
它可以工作,但问题是当输入大量数据时,程序的 GUI 在处理整个数组大小时会冻结片刻(不同于不让 GUI 滞后的异步函数).为了避免冻结?我正在尝试使用 parallel for 但结果似乎是一样的...我该如何解决这个问题?
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");
}
问题是您在循环中使用了 TextBox.Lines
属性。您根本不需要这样做,因为 Lines 属性 每次访问时都会重新创建一个新的字符串数组。只需获取行 属性,即可完成。您不需要在 UI 线程上逐行复制它。
string[] text = textBox.Lines; //Done.
要验证它是否像我描述的那样工作,请查看来源:https://referencesource.microsoft.com/#system.windows.forms/winforms/managed/system/winforms/TextBoxBase.cs,37cabfde1449b18f,references