Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过从WinForms ListView中删除项来优化性能_C#_Winforms_Performance_Listview - Fatal编程技术网

C# 通过从WinForms ListView中删除项来优化性能

C# 通过从WinForms ListView中删除项来优化性能,c#,winforms,performance,listview,C#,Winforms,Performance,Listview,我有一个ListView,它显示来自另一个应用程序的传入消息。我将在很长一段时间内收到这些消息,因此我无法将它们全部保存在ListView中,在某个时候内存将满。此外,我每秒收到许多项目,我的整个应用程序应该有一个良好的性能 当前我的ListView以虚拟模式运行。为了减少所需的内存,如果达到项目的最大数量,我将从虚拟列表中删除索引0处的项目 我现在的问题是移除所需的时间非常长。有没有办法优化这个 以下是我的一些代码,以阐明我的工作: private uint maxItems = 10000;

我有一个ListView,它显示来自另一个应用程序的传入消息。我将在很长一段时间内收到这些消息,因此我无法将它们全部保存在ListView中,在某个时候内存将满。此外,我每秒收到许多项目,我的整个应用程序应该有一个良好的性能

当前我的ListView以虚拟模式运行。为了减少所需的内存,如果达到项目的最大数量,我将从虚拟列表中删除索引0处的项目

我现在的问题是移除所需的时间非常长。有没有办法优化这个

以下是我的一些代码,以阐明我的工作:

private uint maxItems = 10000;
private List<ListViewItem> virtualList = new List<ListViewItem>();
private bool autoScroll = true;

public void AddLine(ListViewItem newLine)
{    
    BeginUpdate();

    virtualList.Add(newLine);

    if (virtualList.Count >= maxItems)
    {
        virtualList.RemoveAt(0);
    }
    else
    {
        this.VirtualListSize = virtualList.Count;
    }

    if (autoScroll)
    {
        this.TopItem = Items[Items.Count - 1];
    }
    else
    {
        if (virtualList.Count == maxItems - 1)
        {
            this.TopItem = Items[this.TopItem.Index - 1];
        }
    }

    EndUpdate();
}

private void ListView_RetrieveVirtualItem(object sender, RetrieveVirtualItemEventArgs e)
{
    e.Item = virtualList[e.ItemIndex];
}
private uint maxItems=10000;
私有列表virtualist=新列表();
private bool autoScroll=true;
公共无效添加行(ListViewItem换行)
{    
开始更新();
添加(换行符);
if(virtualist.Count>=maxItems)
{
virtualist.RemoveAt(0);
}
其他的
{
this.virtualistsize=virtualist.Count;
}
如果(自动滚动)
{
this.TopItem=项目[Items.Count-1];
}
其他的
{
if(virtualist.Count==maxItems-1)
{
this.TopItem=项目[this.TopItem.Index-1];
}
}
EndUpdate();
}
私有void ListView_RetrieveVirtualItem(对象发送方,RetrieveVirtualItemEventArgs e)
{
e、 Item=virtualist[e.ItemIndex];
}

winforms在设计上效率不高,但您可以通过将列表项“接收”移动到单独的线程,然后向UI线程发送更新UI的调用来提高效率,因此,速度较慢的winforms UI不会妨碍应用程序处理传入消息。如果你想要一个最终的解决方案,放弃winforms,使用任何一种基于XAML的最新技术,这些技术比winforms快几个数量级,并且具有内置的UI虚拟化。他的问题其实不是winforms。这是“为什么删除列表的第一个元素(数据结构)很慢。”答案在于如何实现该集合类并分配内存。您不想使用列表,而是希望使用环形缓冲区或类似的数据结构,用较新的项目覆盖较早的项目。是的,但是如何使用我的listview显示存储在环形缓冲区中的数据?但是,我现在正在将wpf用于我的应用程序中与性能相关的部分。但是谢谢你的评论!