C# 请检查我的正则表达式以匹配颜色文本

C# 请检查我的正则表达式以匹配颜色文本,c#,regex,C#,Regex,我需要做一些正则表达式匹配来给richtextbox中的一些文本上色 我已经编写了一个代码,但在性能方面有一个问题,当我在richtextbox中编写时,文本显示速度非常慢,不像正常的RichetTextBox,尤其是当文本变长时 我试着在一个单独的线程中设置每个正则表达式,但没有发生任何事情,结果是相同的 这是我的密码: public void ColorAllQuery() { Thread t = new Thread(() => { this.Di

我需要做一些正则表达式匹配来给richtextbox中的一些文本上色

我已经编写了一个代码,但在性能方面有一个问题,当我在richtextbox中编写时,文本显示速度非常慢,不像正常的RichetTextBox,尤其是当文本变长时

我试着在一个单独的线程中设置每个正则表达式,但没有发生任何事情,结果是相同的

这是我的密码:

public void  ColorAllQuery()
{
    Thread t = new Thread(() =>
    {
        this.Dispatcher.Invoke(new Action(delegate { 
            TextRange range = new TextRange(Richtext.Document.ContentStart, Richtext.Document.ContentEnd);
            range.ApplyPropertyValue(TextElement.ForegroundProperty, new SolidColorBrush(Colors.White));

            Regex FunctionsR = new Regex(Functions, RegexOptions.Compiled | RegexOptions.IgnoreCase);
            Regex Variables = new Regex(Variables, RegexOptions.Compiled | RegexOptions.IgnoreCase);
            Regex Tables = new Regex("(" + TablesNames + ")", RegexOptions.Compiled | RegexOptions.IgnoreCase);
            Regex Columns = new Regex("(" + ColumnsNames + ")", RegexOptions.Compiled | RegexOptions.IgnoreCase);
            Regex Qutation = new Regex(@"'.*?'|n'.*?'|"".*?""|n"".*?""", RegexOptions.Compiled | RegexOptions.IgnoreCase);
            Regex Comment = new Regex(@"(--.*)", RegexOptions.Compiled | RegexOptions.IgnoreCase);

            List<TextPointer> pointer = new List<TextPointer>() ;
            List<Match> matchs = new List<Match>();
            List<Brush> color = new List<Brush>();

            var start = Richtext.Document.ContentStart;

            while (start != null && start.CompareTo(Richtext.Document.ContentEnd) < 0)
            {
                if (start.GetPointerContext(LogicalDirection.Forward) == TextPointerContext.Text)
                {
                    var match = QuerysR.Match(start.GetTextInRun(LogicalDirection.Forward));
            var match2 = FunctionsR.Match(start.GetTextInRun(LogicalDirection.Forward));
            var match3 = Varubls.Match(start.GetTextInRun(LogicalDirection.Forward));
            var match4 = Tables.Match(start.GetTextInRun(LogicalDirection.Forward));
            var match5 = Columns.Match(start.GetTextInRun(LogicalDirection.Forward));
            var match6 = Quotation.Match(start.GetTextInRun(LogicalDirection.Forward));
            var match7 = Comment.Match(start.GetTextInRun(LogicalDirection.Forward));
            pointer.AddRange(new TextPointer[] { start, start, start, start, start, start, start });
            matchs.AddRange(new Match[] { match, match2, match3, match4, match5, match6, match7 });
            color.AddRange(new Brush[] { new SolidColorBrush(Color.FromArgb(255, 0, 120, 255)), Brushes.DeepPink, Brushes.LightGreen, Brushes.Orange, Brushes.Gray, Brushes.Red, Brushes.Green });
        }
        start = start.GetNextContextPosition(LogicalDirection.Forward);
    }

    Thread OT = new Thread(() => ColorGatherdValues(pointer, matchs, color));
    OT.Start();
    }));
    });
    t.Start();
}

private void ColorGatherdValues(List<TextPointer> pointer, List<Match> matchs, List<Brush> color)
{
        for (int i = 0; i < pointer.Count; i++)
        {
            var textrange = new TextRange(pointer.ToArray()[i].GetPositionAtOffset(matchs.ToArray()[i].Index, LogicalDirection.Forward), pointer.ToArray()[i].GetPositionAtOffset(matchs.ToArray()[i].Index + matchs.ToArray()[i].Length, LogicalDirection.Backward));
            textrange.ApplyPropertyValue(TextElement.ForegroundProperty, color.ToArray()[i]);
        }
}
但我的表现有问题

this.Dispatcher.Invoke将调用回GUI线程……如果您希望工作不会妨碍用户,那么这样做没有任何好处

您需要将正则表达式所发现的内容与如何向用户显示区分开来。在单独的线程中运行正则表达式是一个不错的策略,但是在工作完成后应该将结果调用回GUI


让你的处理更容易,现在只需在一个线程中做一件事。一旦该代码正常工作,然后执行其他操作。

寻求调试帮助的问题此代码为什么不正常工作?必须包括所需的行为、特定的问题或错误以及在问题本身中重现这些问题所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:如何创建一个最小、完整且可验证的示例。这个文件有多大?分开的线程看起来太过分了。如果你是一个初学者,也许多线程不应该是你首先要弄明白的事情。从小处开始。'this.Dispatcher.Invoke'调用回GUI线程…如果您想让工作不妨碍用户,这没有任何好处。您的正则表达式可以组合成一个,以减少代码OK,但我将删除该调用,并让ColorGatherdValue执行该工作,但老程序员说我的线程是多余的,我知道我该怎么做,删除线程并将代码设置在一个静态的空中,或者什么?@Moa'adAl-a'athal通过不在单独的线程中进行工作,工作在GUI线程上进行。如果工作需要时间,用户将注意到应用程序的犹豫或完全停止。为了避免这种情况,将所有扩展工作放在后台线程中是可以接受的,也是常见的做法。这就是您必须决定它是否在GUI线程上占用太多时间的原因。IMHO我在后台线程上做所有工作,并保持GUI线程干净,除了通过调用将值推送到控件。