如何提高RichTextBox日志写入性能?

时间:2017-01-03 21:26:31

标签: c# wpf xaml

我使用RichTextBox制作了带有彩色文字的日志窗口。

它会在开始时运行隐藏Hide(),直到您按下按钮将其显示为Show()

我使用的是TextBlock before,但您无法选择文字,因此我切换到了RichTextBox。在几乎瞬间完成之前,它将完成时间增加了5秒。

如何提高写入速度或推迟写入所有消息直到程序结束?

在整个程序中,我使用以下方法多次写入日志:

public partial class MainWindow : Window
{
    public Paragraph paragraph = new Paragraph();  

    public MainWindow()
    {
        InitializeComponent();
    }

    public void MyMethod() {
        rtbLog.Document = new FlowDocument(paragraph);
        paragraph.Inlines.Add(new LineBreak());
        paragraph.Inlines.Add(new Bold(new Run("Log Message Example")) { Foreground = Brushes.Blue });
        paragraph.Inlines.Add(new LineBreak());   
        paragraph.Inlines.Add(new Run("Log Message Example 2") { Foreground = Brushes.White });   
        this.DataContext = this;
    }
}

<RichTextBox x:Name="rtbLog" HorizontalAlignment="Left" VerticalAlignment="Top"
             Width="600" Height="400" Margin="246,10,0,0" Padding="10"
             FontFamily="Consolas" Background="#FF000000"
             Foreground="White" VerticalScrollBarVisibility="Auto"
             IsReadOnly="True" IsUndoEnabled="False"/>

为了提高速度,我尝试使用IsUndoEnabled="False"TextOptions.TextFormattingMode="Display",可能会将时间减少1秒。

log console

2 个答案:

答案 0 :(得分:1)

我会保留两个窗口外的所有日志事件的列表,让两个类都访问它们,这样一些静态类:

public static class Logs
{
    public static Paragraph Paragraph { get; set; }

    static Logs()
    {
        Paragraph = new Paragraph();
    }
}

然后,当您需要写入日志时,请执行以下操作:

public void MyMethod()
{
    Logs.Paragraph.Inlines.Add(new LineBreak());
    Logs.Paragraph.Inlines.Add(new Bold(new Run("Log Message Example")) { Foreground = Brushes.Blue });
}

然后当你想要显示窗口调用时:

SomeWindow someWindow = new SomeWindow();
someWindow.ShowDialog(); //Or show

然后你需要一个带有RichTextBox的新窗口类,并在开始时添加段落。

public class SomeWindow : Window
{
    public SomeWindow()
    {
        rtbLog.Document = new FlowDocument(Logs.Paragraph);
    }
}

答案 1 :(得分:0)

我能够通过调整代码来解决写入性能。

一个问题是多次使用rtbLog.Document = new FlowDocument(段落)。

  • 将多个Inline.Add()放入动作列表中。

  • 创建方法,使用带有BeginChange()&amp;的foreach循环将所有动作写入RichTextBox EndChange()。

  • 可选择将Method放入BackgroundWorker中。

现在速度很快。

List<Action> LogActions = new List<Action>();
Action WriteAction;


// Create Multiple Actions 
WriteAction = () =>
{
    paragraph.Inlines.Add(new LineBreak());
    paragraph.Inlines.Add(new Bold(new Run("Example")) { Foreground = Brushes.White });
};
// Add Actions to List
LogActions.Add(WriteAction);


// At End of Program or in a Method:

public void LogWriteAll() {
    // Write All Actions in List
    myWindow.rtbLog.Document = new FlowDocument(paragraph);

    // Begin Rich Textbox Change
    myWindow.rtbLog.BeginChange();

    foreach (Action Write in LogActions)
    {
        Write();
    }

    myWindow.rtbLog.EndChange();
}