Долгое время зависания при загрузке файла | Двоичный | C # | Список - PullRequest
0 голосов
/ 11 апреля 2020

Мне интересно, почему время загрузки файла так долго. Я был бы признателен, если бы вы нашли время, чтобы посмотреть, где написано:

if (ReadType == 1)

При загрузке около 12 000 элементов требуется почти 12 секунд для загрузки файла с короткой структурой, я не думаю, что это правильно. Я новичок в c# и могу использовать любые указатели, прикрепленные ниже, это код и структура файла: здесь также прикреплено видео о проблеме: видео снимок экрана файла: Structureloaded

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace StringEditor
{
 public class ItemStr
  {
    public int a_index;
    public byte[] a_name { get; set; }
    public byte[] a_descr1 { get; set; }
   }
}

private void tsbOpen_Click(object sender, EventArgs e)
    {
        OpenFileDialog ofd = new OpenFileDialog();
        ofd.Filter = "String|*.lod";
        if (ofd.ShowDialog() != DialogResult.OK)
            return;
        if (!ofd.FileName.Contains("strItem") && !ofd.FileName.Contains("strSkill")) //check to see if user isn't opening the right files if not return;
            return;
        else if (ofd.FileName.Contains("strItem"))
            ReadType = 1;
        else if (ofd.FileName.Contains("strSkill"))
            ReadType = 2;


        FileStream fs = new FileStream(ofd.FileName, FileMode.Open);
        BinaryReader br = new BinaryReader(fs);
        if (ReadType == 1)
        {
            int max = br.ReadInt32();
            int max1 = br.ReadInt32();

            for (int i = 0; br.BaseStream.Position < br.BaseStream.Length; i++)
            {
                ItemStr itemstr = new ItemStr();
                itemstr.a_index = br.ReadInt32();
                itemstr.a_name = br.ReadBytes(br.ReadInt32());
                itemstr.a_descr1 = br.ReadBytes(br.ReadInt32());
                itemStringList.Add(itemstr);
                listBox1.Items.Add(itemstr.a_index.ToString() + " - " + Encoding.GetEncoding(ISO).GetString(itemstr.a_name));


            }
            EnableFields();


        }
        fs.Close();
        br.Close();
        if (ReadType == 2)

        {
            int max = br.ReadInt32();
            int max1 = br.ReadInt32();
            for (int i = 0; i < max; i++)
            {
                skillStr skillStr = new skillStr();

                skillStr.a_index = br.ReadInt32();
                skillStr.a_name = br.ReadString();
                skillStr.a_tool_tip = br.ReadString();
                skillStr.a_descr1 = br.ReadString();
                skillStringList.Add(skillStr);
                string test = skillStr.a_index + "- " + skillStr.a_name;
                listBox1.Items.Add(test);


            }
            EnableFields();


        }
        fs.Close();
        br.Close();

    }

Ответы [ 3 ]

2 голосов
/ 11 апреля 2020

Я написал небольшой тест на моей машине с ядром i5. Новая форма, одна кнопка, одно поле со списком:

    private void button1_Click(object sender, EventArgs e)
    {
        for (int i = 0; i < 30000; i++)
            listBox1.Items.Add(i.ToString());
    }

(я написал это, догадываясь по номерам индексов на скриншоте). Нажал go. Пришлось подождать 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();
    }

И произошла едва заметная задержка, прежде чем он снова стал пригодным для использования


Большая часть проблемы не в читая файл, он имеет список refre sh сам X раз по мере добавления по одному. Используйте обновление «Начало / Конец», чтобы указать, что вы загружаете большое количество элементов ...

... но, опять же, спросите себя, что пользователь ДЕЙСТВИТЕЛЬНО собирается делать с Х десятками тысяч элементов в списке? В качестве руководства для пользовательского интерфейса или пользовательского интерфейса избегайте загрузки в список более 20-30 элементов. Кроме того, это становится нецелесообразным, особенно в количествах, которые вы загружаете. Рассмотрим тип окна поиска - прыжок в один пиксель полосы прокрутки будет перемещаться по большему количеству элементов, чем может поместиться в вашем списке по вертикали!

0 голосов
/ 13 апреля 2020

Listbox.beginupdate () и listbox.endupdate () исправили мою проблему, спасибо за помощь, ребята.

0 голосов
/ 12 апреля 2020

Если вы загружаете много данных из файла (или из любого места) в список, рассмотрите возможность использования подхода VirtualList - пример можно найти здесь:

Свойство ListView.VirtualMode

Возможно, вы также захотите выполнить загрузку в фоновом потоке, чтобы пользователь не испытывал явную «зависающую» задержку, которую может вызвать загрузка большого количества данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...