我在另一个类中有一个方法,它从textbox2中选择了包含给定char的所有行,并在button_click上将其打印到textbox3,但是我遇到了这个错误(从除此以外的其他线程中访问了textBox3) 。
public void plinq()
{
List<string> lines = new List<string>(textBox2.Lines);
List<string> lines2 = new List<string>();
try
{
if (textBox3.InvokeRequired)
{
textBox3.Invoke(new Action(plinq));
}
else
{
lines.AsParallel().ForAll(K =>
{
for (int i = 0; i < K.Length; i++)
{
if (lines[i].Contains(textBox4.Text))
{
lines2.Add(lines[i]);
}
}
textBox3.Lines = lines2.ToArray();
});
}
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
}
}
引用的副本很旧。这不是不准确-可以早于PLINQ。
看这里:
MS Documentation: Potential pitfalls with PLINQ
避免调用非线程安全方法
从PLINQ查询写入非线程安全实例方法可以导致数据损坏,可能会或可能不会在您的计算机中找不到程序。它还可能导致异常。在以下示例中,多个线程将尝试调用FileStream.Write方法同时运行,该类不支持。
...
[尽可能使用ForAll首选ForAll
尽管PLINQ会在多个线程上执行查询,结果进入foreach循环(对于Visual Basic中的Each),然后查询结果必须合并回一个线程并进行访问枚举器按顺序进行。在某些情况下,这是不可避免的。但是,只要有可能,请使用ForAll方法启用每个线程输出自己的结果,例如,通过写入线程安全的集合,例如System.Collections.Concurrent.ConcurrentBag。
同一问题适用于Parallel.ForEach。换一种说法,强烈建议使用source.AsParallel()。Where()。ForAll(...)到Parallel.ForEach(source.AsParallel()。Where(),...)。
...
注意线程相似性问题
某些技术,例如COM的互操作性单线程单元(STA)组件,Windows窗体和WindowsPresentation Foundation(WPF),强加线程关联性限制要求代码在特定线程上运行。例如,在两个Windows窗体和WPF,只能在线程上访问控件它是创建的。如果您尝试访问共享的状态PLINQ查询中的Windows窗体控件,如果您出现异常在调试器中运行。 (可以关闭此设置。)但是,如果查询是在UI线程上使用的,则可以从枚举查询的foreach循环中访问控件结果,因为该代码仅在一个线程上执行。
...
请更新您的帖子:
Q1:错误发生在哪一行?
Q2:它是在调试器中,在调试器之外还是在两者中发生?
Q3:使用链接中的任何建议重构代码是否有帮助?
Q4:重构代码以使对“ TextBox3”的所有修改都发生在PLinq的OUTSIDE上(并在UI线程上发生在[[ONLY上)帮助吗?