Хаотическое распределение строк по категориям - PullRequest
1 голос
/ 14 июня 2019

Большой список строк.Я делю его на несколько списков и запускаю метод «SpellChecker» для исправления орфографических ошибок в строках.Затем я запускаю метод SearchKeyWordsInString, который должен коррелировать эти строки в соответствии с ключевыми словами в некоторых категориях.НО, вывод не является правильным соответствием линий и категорий.У меня есть список строк, я делю этот список на несколько подсписков и запускаю задачи для каждого подсписка.Проблема возникает, когда после запуска задачи с помощью метода проверки орфографии я в продолжение этой задачи запускаю метод категоризации этих строк.Нет такой ситуации, если я не разделяю исходные строки и не выполняю одну задачу.

        List<string> strListExcel = null;

        var excel = new Excel();
        excel.OpenFileNPOI(pathAndNameFile);
        excel.ReadFileNPOI(out strListExcel);
        excel.CloseFileNPOI();
        var stringUnderList = new List<List<string>>();

        int index = 0;
        int countProcess = Environment.ProcessorCount * 1;
        int countStr = strListExcel.Count;
        int count = countStr / countProcess;

        while (true)
        {
            stringUnderList.Add(new List<string>());
            stringUnderList[index].AddRange(strListExcel.Skip(index * count).Take(count));
            index++;
            if (index == countProcess + 1)
                break;
        }

        var tasks = new List<Task<List<DataCategory>>>();

        for (int i = 0; i < stringUnderList.Count; i++)
        {
            var localStringUnderList = stringUnderList[i];
            Task<List<DataCategory>> task = Task.Run(() => Text.SpellChecker(localStringUnderList)).ContinueWith(t => Text.SearchKeyWordsInString(t.Result));

            tasks.Add(task);
        }

        Task.WaitAll(tasks.ToArray());

        var dataCategoryList = new List<DataCategory>();

        for (int i = 0; i < stringUnderList.Count; i++) //count task = count stringUnderList
            _dataCategoryList.AddRange(tasks[i].Result);

1 Ответ

2 голосов
/ 14 июня 2019

Ваш код приводит к тому, что некоторые из последних строк не обрабатываются, когда остаток от countStr / countProcess is не 0 (countStr % countProcess != 0).

Меняется

if (index == countProcess + 1) 
  break;

на

if (index == countProcess + 1) {
  stringUnderList[index].AddRange(strListExcel
    .Skip(index * count)
    .Take(countStr % countProcess));

  break;
}
...