执行Plinq查询时从其他线程获取的错误textBox3被创建

问题描述 投票:0回答:1

我在另一个类中有一个方法,它从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());
        }
    }

enter image description here

c# plinq
1个回答
1
投票

引用的副本很旧。这不是不准确-可以早于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上)帮助吗?

© www.soinside.com 2019 - 2024. All rights reserved.