文件加载时长挂起时间|二进制| C#|列表

文件加载时长挂起时间|二进制| C#|列表,c#,list,binary,freeze,C#,List,Binary,Freeze,我想知道为什么文件的加载时间这么长。如果你能花点时间看看上面写着什么,我将不胜感激 if (ReadType == 1) 大约12000件物品正在装货 加载一个结构较短的文件需要将近12秒,我认为这是不对的。我是c#新手,可以使用下面附带的任何指针,即代码和文件结构: 这里还附上了该问题的视频: 文件截图: 使用系统; 使用System.Collections.Generic; 使用System.Linq; 使用系统文本; 使用System.Threading.Tasks; 命名空间字符串编

我想知道为什么文件的加载时间这么长。如果你能花点时间看看上面写着什么,我将不胜感激

if (ReadType == 1)
大约12000件物品正在装货 加载一个结构较短的文件需要将近12秒,我认为这是不对的。我是c#新手,可以使用下面附带的任何指针,即代码和文件结构: 这里还附上了该问题的视频: 文件截图:

使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
命名空间字符串编辑器
{
公共类ItemStr
{
公共综合指数;
公共字节[]a_name{get;set;}
公共字节[]a_descr1{get;set;}
}
}
私有void tsbOpen_单击(对象发送者,事件参数e)
{
OpenFileDialog ofd=新建OpenFileDialog();
ofd.Filter=“字符串|*.lod”;
if(ofd.ShowDialog()!=DialogResult.OK)
返回;
if(!ofd.FileName.Contains(“strItem”)和&!ofd.FileName.Contains(“strSkill”)//检查用户是否打开了正确的文件(如果没有返回);
返回;
else if(ofd.FileName.Contains(“strItem”))
ReadType=1;
else if(ofd.FileName.Contains(“strSkill”))
ReadType=2;
FileStream fs=newfilestream(ofd.FileName,FileMode.Open);
BinaryReader br=新的BinaryReader(fs);
if(ReadType==1)
{
int max=br.ReadInt32();
int max1=br.ReadInt32();
for(int i=0;br.BaseStream.Position
我在我的core i5机器上写了一个小测试。新表单、一个按钮、一个列表框:

    private void button1_Click(object sender, EventArgs e)
    {
        for (int i = 0; i < 30000; i++)
            listBox1.Items.Add(i.ToString());
    }
private void按钮1\u单击(对象发送者,事件参数e)
{
对于(int i=0;i<30000;i++)
listBox1.Items.Add(i.ToString());
}
(我是根据你截图中的索引数字写的)。点击开始。用户界面再次可用之前必须等待11秒

我将其修改为:

    private void button1_Click(object sender, EventArgs e)
    {
        listBox1.BeginUpdate();
        for (int i = 0; i < 30000; i++)
            listBox1.Items.Add(i.ToString());
        listBox1.EndUpdate();
    }
private void按钮1\u单击(对象发送者,事件参数e)
{
listBox1.BeginUpdate();
对于(int i=0;i<30000;i++)
listBox1.Items.Add(i.ToString());
listBox1.EndUpdate();
}
在它再次可用之前,几乎没有明显的延迟


大多数问题不是读取文件,而是在逐个添加时让列表框自身刷新数千次。使用“开始/结束更新”来表示正在加载大量项目


…但请再次扪心自问,对于列表框中的数万个项目,用户真正要做什么?作为UI/UX指南,避免将超过20到30个项目加载到列表中。除此之外,它将变得不可用,尤其是在你装载的数量上。考虑一个类型的搜索框-滚动条的一个像素跳跃将移动更多的项目,而不是可以垂直排列在列表中。p> 我在我的core i5机器上写了一个小测试。新表单、一个按钮、一个列表框:

    private void button1_Click(object sender, EventArgs e)
    {
        for (int i = 0; i < 30000; i++)
            listBox1.Items.Add(i.ToString());
    }
private void按钮1\u单击(对象发送者,事件参数e)
{
对于(int i=0;i<30000;i++)
listBox1.Items.Add(i.ToString());
}
(我是根据你截图中的索引数字写的)。点击开始。用户界面再次可用之前必须等待11秒

我将其修改为:

    private void button1_Click(object sender, EventArgs e)
    {
        listBox1.BeginUpdate();
        for (int i = 0; i < 30000; i++)
            listBox1.Items.Add(i.ToString());
        listBox1.EndUpdate();
    }
private void按钮1\u单击(对象发送者,事件参数e)
{
listBox1.BeginUpdate();
对于(int i=0;i<30000;i++)
listBox1.Items.Add(i.ToString());
listBox1.EndUpdate();
}
在它再次可用之前,几乎没有明显的延迟


大多数问题不是读取文件,而是在逐个添加时让列表框自身刷新数千次。使用“开始/结束更新”来表示正在加载大量项目


…但请再次扪心自问,对于列表框中的数万个项目,用户真正要做什么?作为UI/UX指南,避免将超过20到30个项目加载到列表中。除此之外,它将变得不可用,尤其是在你装载的数量上。考虑一个类型的搜索框-滚动条的一个像素跳跃将移动更多的项目,而不是可以垂直排列在列表中。P> > P>如果你从一个文件(或任何地方)加载大量数据到列表框中,考虑使用ValualListor方法——这里可以找到一个例子:


您可能还想考虑在后台线程中执行负载,这样用户就不会体验加载大量数据所产生的明显的“挂起”延迟。