Многопоточность, потокобезопасность. Простая программа по обработке .txt файлов - C#

Узнай цену своей работы

Формулировка задачи:

Добрый день, коллеги. Помогите исправить код. Программа запрашивает количество потоков, делит их между текстовыми файлами исходя из определённой логики. Выводит информацию: номер потока, название файла, который обработался. Во время дебага работает стабильно, во время исполнения без дебага - не так как задумывалось (поток с номером 0 почти никогда не выводится, часто дублируется информация "поток-файл"). Проблема с потокобезопасностью? Как наладить?
Листинг программы
  1. using System;
  2. using System.Threading;
  3. using System.IO;
  4. class streams
  5. {
  6. public static void StreamsStart(int threads, string[] directory)
  7. {
  8. Thread[] threadArray;
  9. int filesCount = directory.Length;
  10. //если количество файлов и потоков равное - каждому потоку по файлу
  11. if (threads == filesCount)
  12. {
  13. for (int i = 0; i < (threadArray = new Thread[threads]).Length; i++)
  14. {
  15. threadArray[i] = new Thread(new ThreadStart(() => { ReadFiles(i, directory[filesCount-1]); })) { IsBackground = true };
  16. threadArray[i].Start();
  17. filesCount--;
  18. }
  19. }
  20. //если количество файлов меньше, чем потоков - потоки делим между файлами,
  21. //вначале раздаём всем файлам по 1 потоку
  22. //потом снова всем (или кому хватит) по 1 потоку и т.д.
  23. else if (threads > filesCount)
  24. {
  25. for (int i = 0; i < (threadArray = new Thread[threads]).Length; i++)
  26. {
  27. if (filesCount < 1)
  28. {
  29. filesCount = directory.Length;
  30. }
  31. threadArray[i] = new Thread(new ThreadStart(() => { ReadFiles(i, directory[filesCount-1]); })) { IsBackground = true };
  32. threadArray[i].Start();
  33. filesCount--;
  34. }
  35. }
  36. // если количество файлов больше, чем потоков - файлы делим между потоками, так: Например 26 файлов, 3 потока.
  37. // 26/3 = 8
  38. // и 2 в остатке.
  39. // 2 потока получают 9 файлов, 1 поток 8 файлов.
  40. else
  41. {
  42. // целое
  43. int withoutResidue = filesCount / threads;
  44. // остаток
  45. int residue = filesCount % threads;
  46. for (int i = 0; i < (threadArray = new Thread[threads]).Length; i++)
  47. {
  48. threadArray[i] = new Thread(new ThreadStart(() =>
  49. {
  50. //раздаём гарантировано всем потокам по целому набору файлов
  51. for (int j = 0; j < withoutResidue; j++)
  52. {
  53. ReadFiles(i, directory[filesCount-1]);
  54. filesCount--;
  55. }
  56. //если есть остаток, даём каждому потоку по 1 файлу, пока остаток не исчерпается
  57. if (residue != 0)
  58. {
  59. ReadFiles(i, directory[filesCount-1]);
  60. filesCount--;
  61. residue--;
  62. }
  63. }
  64. )) { IsBackground = true };
  65. threadArray[i].Start();
  66. }
  67. }
  68. }
  69. private static readonly object syncRoot = new object();
  70. static void ReadFiles(int thread, string fileName)
  71. {
  72. lock (syncRoot)
  73. {
  74. using (FileStream file = File.Open(fileName, FileMode.Open))
  75. using (StreamReader stream = new StreamReader(file))
  76. {
  77. while (stream.Peek() >= 0)
  78. {
  79. stream.ReadLine();
  80. }
  81. Console.WriteLine("Thread {0}, Filename {1}", thread, file.Name);
  82. }
  83. }
  84. }
  85. }
  86.  
  87. class Program
  88. {
  89. static void Main(string[] args)
  90. {
  91. string[] directory = Directory.GetFiles(@"C:\folder", "*.txt");
  92.  
  93. Console.WriteLine("input number of threads");
  94. int threads = int.Parse(Console.ReadLine());
  95. streams.StreamsStart(threads, directory);
  96. // endofprogram
  97. Console.ReadKey();
  98. }
  99. }

Решение задачи: «Многопоточность, потокобезопасность. Простая программа по обработке .txt файлов»

textual
Листинг программы
  1. threadArray[i] = new Thread(new ParameterizedThreadStart(k =>
  2. ..............
  3. threadArray[i].Start(i);

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4.214 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы