Мне нужно перебрать Parallel для l oop в StreamReader ReadLine (), но застрял при многопоточном доступе к объекту - PullRequest
0 голосов
/ 01 апреля 2020

Я попытался создать объект чтения потоков (sr) внутри параллели для l oop. Это работает, но требуется 1,3 минуты для извлечения данных, которые должны были быть получены менее чем за 4 секунды. Проблема, как я надеюсь, где-то связана с этим StreamReader объектом. При попытке с приведенным ниже кодом я получаю сообщение об ошибке, которое я пытался решить многими способами, но в настоящее время очень сильно застрял на нем. Даже использованные параллельные пакеты, volatile, ThreadStatic и lock.

static void Main(string[] args)
{
    Task.Run(() =>
    {
        Thread th0 = new Thread(() => ReadAllLinesAsync(
            @"C:\Users\Administrator\Desktop\Fnale mail\LineDataBackHigh.csv"));
        th0.Start();
        th0.Join();
        watch.Stop();
        Debug.Log("time=" + watch.Elapsed);
        Debug.Log("Finished Task + ");
    });

    Debug.Log("Free Executed, Task Independent");
}

public static string[] ReadAllLinesAsync(string path)
{
    ConcurrentBag<string> lines = new ConcurrentBag<string>();

    // Open the FileStream with the same FileMode, FileAccess
    // and FileShare as a call to File.OpenText would've done.
    using (StreamReader sr = File.OpenText(path))
    {
        string line = String.Empty;
        int k = 0;
        sr8 = sr;

        Thread th0 = new Thread(Fetch);

        th0.Start();
        th0.Join();
        Debug.Log("Finished Reading2" + lines.Count);
        int item = 1;

        void Fetch()
        {
            Parallel.For(k, File.ReadLines(path).Count(), z =>
            {
                sr8 = sr;
                Debug.Log("Executing");
                lines.Add(sr8.ReadLine());
                // sr.Dispose();
            });
        }
    }
    return lines.ToArray();
}

Ошибка:

enter image description here enter image description here

1 Ответ

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

Похоже, вы пытаетесь распараллелить метод File.ReadLines, чтобы вы могли читать строки файла несколькими потоками параллельно. К сожалению, это не так просто. И даже если вы найдете способ сделать это, например, открыв файл с несколькими StreamReader s в разных позициях и разделив вручную строки после декодирования байтов, нет никакой гарантии, что вы получите какое-либо повышение производительности. Напротив, вполне возможно, что чтение файла будет значительно медленнее из-за того, как часто головки жесткого диска должны будут переходить из сектора в сектор.

Мой совет - просто использовать File.ReadLines метод как есть, и найти другие места в вашем коде, которые могут быть оптимизированы для производительности.

...