Unity3D & C# Разбор большого файла построчно без остановки пользовательского интерфейса и обновления слайдера Unity с прогрессом - PullRequest
0 голосов
/ 29 апреля 2020

У меня большой набор данных, содержащий около 120 000 записей, и я хотел бы проанализировать его построчно.

    private void readDataset()
    {
        totalEntries = File.ReadLines(path).Count();
        entriesRead = 0;
        statusSlider.maxValue = totalEntries;
        statusSlider.minValue = entriesRead;
        statusSlider.value = entriesRead;
        using (StreamReader sr = new StreamReader(path))
        {
            string line;
            while ((line = sr.ReadLine()) != null)
            {
                entriesRead++;
                statusSlider.value = entriesRead;
                ...
                ...
            }
        }
    }

К сожалению, с помощью кода, показанного выше, пользовательский интерфейс зависает и начинает отвечать только при синтаксическом анализе закончил Это означает, что слайдер перепрыгивает с 0% до 100%, и программа просто зависает между ними.

Можно ли запустить это без блокировки основного потока пользовательского интерфейса, а также повторно ссылаться на sh слайдер каждый раз, пока l oop повторяется?

1 Ответ

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

Вы можете использовать сопрограммы . Они не будут блокировать пользовательский интерфейс.

Итак, в вашем случае вы можете сделать это;

private void StartReading() 
{
    StartCoroutine(ReadDataSet());
}

private IEnumerator ReadDataSet()
{
    totalEntries = File.ReadLines(path).Count();
    entriesRead = 0;
    statusSlider.maxValue = totalEntries;
    statusSlider.minValue = entriesRead;
    statusSlider.value = entriesRead;
    using (StreamReader sr = new StreamReader(path))
    {
        string line;
        while ((line = sr.ReadLine()) != null)
        {
            entriesRead++;
            statusSlider.value = entriesRead;
            ...
            ...
            Debug.Log($"Current Line {entriesRead}, ({(entriesRead/totalEntries)*100f}%)");
            yield return null;
        }
    }
}

Там вы будете ждать новый кадр после прочтения каждой строки, также он будет печатать текущая строка и% от общей суммы.

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