StreamReader внутри цикла foreach CheckedItems - PullRequest
0 голосов
/ 15 марта 2012

У меня есть проблема, которую я пытаюсь решить часами, и я уверен, что это что-то простое.

Вот код (лишний мусор удален, так как это не проблема).

foreach (String itemChecked in fightsList.CheckedItems)
{
    try
    {
        Thread.Sleep(50);
        using (StreamReader reader = new StreamReader(new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite), Encoding.ASCII))
            {
                while ((line = reader.ReadLine()) != null)
                    {
                        // do all stuff to lines here...
                    }
            }
    }
    catch (Exception error)
        {
            errorText.Text = error.ToString();
        }
}
// foreach done here.

Я читаю текстовый файл, очевидный из StreamReader, но когда цикл foreach переходит ко второй итерации, он завершается неудачно перед запуском StreamReader и останавливает цикл foreach.

Первый цикл работает отлично.

Я думаю, что это проблема, потому что «StreamReader reader = new» уже существует и не может создать новый?

foreach - это проверенная строка. StreamReader читает один и тот же файл для всех экземпляров цикла, я просто определяю, где начинать и останавливаться для каждого. Моя ловушка ошибок ничего не получает, и приложение не падает.

Ответы [ 2 ]

2 голосов
/ 15 марта 2012

Я думаю, что у вас есть логическая проблема в том, что вы продолжаете пытаться читать из одного и того же файла на каждой итерации цикла (если только вы не удалили что-то релевантное из вашего кода).Если вы хотите читать из одного и того же файла после каждого цикла, вам нужно будет создать потоковое считыватель только один раз, вне внешнего цикла for.Кроме того, поскольку вы не закрываете файл, у вас могут возникнуть проблемы с тем, что он находится в конце файла после первой итерации.Это объясняет, почему это работает только в первый раз

0 голосов
/ 15 марта 2012

Проблема не в коде, который вы опубликовали.Я бы предложил выделить поток файлов в качестве отдельного шага и поместить точку останова на строку, где вы передаете его в StreamReader.На втором проходе убедитесь, что все (имя файла, длина и т. Д.) Выглядит нормально в основном потоке, ваша проблема находится внутри цикла, в противном случае она находится в другом месте вашего кода.1003 *

using(StreamReader reader = new StreamReader(new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite), Encoding.ASCII)){
    while ((line = reader.ReadLine()) != null)
    {
        foreach (String itemChecked in fightsList.CheckedItems)
       {
       }
    }
}

, поскольку это приведет к тому, что дорогостоящая операция (файловый ввод-вывод) будет выполняться как можно меньше раз, но это не та причина, по которой у вас возникает эта конкретная проблема.

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