使.NET TextBox工作FIFO样式

埃德加·詹姆斯(Edgar James)Luffternstat

我有一个用C#编写的Win GUI应用程序,其中有一个TextBox我要写入日志组件。在某些时候,它变得太负载,整个应用程序开始步履蹒跚。我想建立一种有效的机制使其成为FIFO,这意味着-将其设置为固定大小并自动删除最旧的内容。

有什么.net / c#功能吗?否则,什么是正确的方法?

更新:我也遇到了其他类型的文本数据问题,而不仅是日志问题。因此,这ListBox对我来说不是一个合适的解决方案。

本·沃格特

要为文本创建循环缓冲区,我将使用StringBuilder,其容量设置为大约要显示的数据量的两倍。

const int DisplaySize = 10000;
StringBuilder fifo = new StringBuilder(2 * DisplaySize);

string AppendToFifo( string s )
{
    if (s.Length >= DisplaySize) {
        // FACT: the display will only include data from s
        // therefore, toss the entire buffer, and only keep the tail of s
        fifo.Clear();
        fifo.Append(s, s.Length - DisplaySize, DisplaySize);
        return fifo.ToString();
    }
    if (fifo.Length + s.Length > fifo.Capacity) {
        // FACT: we will overflow the fifo
        // therefore, keep only data in the fifo that remains on the display
        fifo.Remove(0, fifo.Length + s.Length - DisplaySize);
    }
    fifo.Append(s);
    if (fifo.Length <= DisplaySize) {
        // FACT: the entire fifo content fits on the display
        // therefore, send it all
        return fifo.ToString();
    }
    // FACT: the fifo content exceed the display size
    // therefore, extract just the tail
    return fifo.ToString(fifo.Length - DisplaySize, DisplaySize);
}

如果if条件都不为真,则快速路径将避免所有不必要的副本(在字符串不可变的.NET世界中,无法避免创建输出字符串的最终副本)。在其他情况下,仅复制所需的字符。增加缓冲区的容量将提高快速路径的利用率。我一直在避免做的是创建一个字符串对象,该对象具有保留在显示器上的旧内容,除了连接新内容外,它没有其他用途,并立即变成垃圾。

显然,如果使用p / invoke传递指向StringBuffer内容的指针,而不是复制出子字符串,则效率会更高。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在ASP.NET MVC中设定Html.textbox的样式

来自分类Dev

将ListBox值添加到ASP.Net中的Button单击上的TextBox不能正常工作

来自分类Dev

.NET中的工作线程同步

来自分类Dev

WPF Net Framework 3.5 Window Metro样式

来自分类Dev

ASP.NET中的CSS样式

来自分类Dev

vb.net获取HTML元素的样式

来自分类Dev

.NET中的热图样式渐变

来自分类Dev

WPF Net Framework 3.5 Window Metro样式

来自分类Dev

在ASP.NET中更改div的样式

来自分类Dev

vb.net获取HTML元素的样式

来自分类Dev

ASP.NET Bootstrap 导航栏样式

来自分类Dev

NET 4.5的奇怪TextBox问题-否。允许的

来自分类Dev

ASP NET强制TextBox更新或失去焦点

来自分类Dev

vb.net TextBox提交未更改

来自分类Dev

ASP.NET TextBox控件未包装

来自分类Dev

ASP.NET中TextBox的KeyPress事件

来自分类Dev

vb.net TextBox 不会改变

来自分类Dev

VB.net中json.net的简单工作示例

来自分类Dev

VB.net中json.net的简单工作示例

来自分类Dev

覆盖BorderBrush的TextBox样式

来自分类Dev

.NET 4.0中的CallerMemberName无法正常工作

来自分类Dev

asp.net WebMethod无法正常工作

来自分类Dev

==的工作方式以及.NET内部的作用

来自分类Dev

.NET数字签名如何工作?

来自分类Dev

无法使HtmlReportPlugin在CruiseControl.NET中工作

来自分类Dev

Gmap.net缓存如何工作?

来自分类Dev

JSON.NET:JsonCreationConverter工作WriteJson实现

来自分类Dev

callvirt .NET指令如何为接口工作?

来自分类Dev

在protobuf-net中如何派生工作?