Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 16.06.2021
Сообщений: 45

Почему таски не выполняются асинхронно?

12.11.2022, 23:49. Показов 472. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Почему таски начинают выполняться друг за другом, а не асинхронно?

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using System.Text;
 
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
Console.OutputEncoding = Encoding.UTF8;
Console.InputEncoding = Encoding.GetEncoding(1251);
 
try
{
    Console.WriteLine("Введите путь к папке с xls/xlsx файлами: ");
    string directoryPath = Console.ReadLine()!.Replace("\"", "").Trim();
 
    List<Task<string?>> tasks = new();
    foreach (var file in Directory.GetFiles(directoryPath))
    {
        Console.WriteLine($"Обработка {file}");
 
        tasks.Add(GetRowsFromTable(file));
    }
 
    using (StreamWriter writer = new StreamWriter("result.txt"))
    {
        foreach (var task in tasks)
        {
            if (task.Result is not { } result)
                throw new();
 
            writer.Write(result);
        }
    }
}
catch (Exception ex)
{
    Console.WriteLine("Ошибка." +
        $"\nex: {ex.Message}");
}
 
Console.WriteLine("Нажмите что-нибудь чтобы продолжить.");
Console.ReadKey();
 
async Task<string?> GetRowsFromTable(string filepath)
{
    return await Task.Run(() =>
    {
        IWorkbook workbook;
        if (filepath.EndsWith(".xlsx"))
            workbook = new XSSFWorkbook(filepath);
        else
            workbook = new XSSFWorkbook(filepath);
 
        StringBuilder itogBuilder = new StringBuilder();
 
        for (int s = 0; s < workbook.NumberOfSheets; s++)
        {
            ISheet sheet = workbook.GetSheetAt(s);
 
            for (int i = 0; i < sheet.PhysicalNumberOfRows; i++)
            {
                try
                {
                    if (sheet.GetRow(i) is null)
                        continue;
 
                    bool vivod = false;
                    foreach (var cell in sheet.GetRow(i).Cells)
                    {
                        string cellValue = cell.CellType switch
                        {
                            CellType.Numeric => cell.NumericCellValue.ToString(),
                            CellType.String => cell.StringCellValue,
                            _ => string.Empty
                        };
 
                        if (cell.CellType == CellType.Formula && cell.CachedFormulaResultType != CellType.Error)
                        {
                            try
                            {
                                cellValue = cell.RichStringCellValue.String;
                            }
                            catch (Exception)
                            {
                                cellValue = cell.NumericCellValue.ToString();
                            }
                        }
 
                        if (!string.IsNullOrWhiteSpace(cellValue))
                        {
                            itogBuilder.Append($"{cellValue} ");
                            if (!vivod)
                                vivod = true;
                        }
                    }
 
                    if (vivod)
                    {
                        itogBuilder.Append("\n");
                        vivod = false;
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine($"Не удалось получить значение ячейки {i + 1}." +
                        $"\nСообщение ошибки: {ex.Message}" +
                        $"\n\nЧтобы продолжить нажмите Enter.");
                    Console.ReadLine();
 
                    return null;
                }
            }
        }
 
        Console.WriteLine($"Обработан {filepath}");
        return itogBuilder.ToString();
    });
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.11.2022, 23:49
Ответы с готовыми решениями:

Потоки выполняются не асинхронно
Здравствуйте, пытаюсь написать алгоритм обедающих философов, вкратце нужно запустить несколько потоков уходящих в бесконечный цикл с...

Задачи не выполняются асинхронно celery
Здравствуйте! Используя celery и запуская задачи одну за другую не получается добиться асинхронности. Celery производит выполнение первой...

Почему процессоры работают асинхронно?
Прога на Qt c++, моё творение. Возможно ли что при компиляции нужно указывать к-во ядер процессора? Помню есть какая-то опция, там ещё...

8
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
13.11.2022, 10:13
Maxi4ek8, как это проявляется?
0
0 / 0 / 0
Регистрация: 16.06.2021
Сообщений: 45
13.11.2022, 14:31  [ТС]
просто не нагружается цп и рботают друг за другом
0
403 / 265 / 69
Регистрация: 12.04.2020
Сообщений: 1,404
13.11.2022, 15:19
Цитата Сообщение от Maxi4ek8 Посмотреть сообщение
просто не нагружается цп и рботают друг за другом
а цп должно загружаться?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
13.11.2022, 15:52
Цитата Сообщение от Maxi4ek8 Посмотреть сообщение
не нагружается цп и рботают друг за другом
Возможные причины:
1. В асинхронном методе в случае исключения вызывается Console.ReadLine — если исключения вызываются для всех файлов, то будет упорядоченное выполнение.
2. Запущенная задача успевает отработать до запуска следующей
3. Где-то в реализации используемой библиотеки встроенная синхронизация, не позволяющая обрабатывать более одного файла за раз.
0
ладно
 Аватар для TeBrado
71 / 50 / 20
Регистрация: 29.12.2021
Сообщений: 274
Записей в блоге: 1
13.11.2022, 16:04
Когда таск начинает выполнятся, он можно сказать замораживает процесс. Вот поэтому они и выполняются друг за другом. Решение вроде использовать другой поток,но я хз и могу говорить бред про эти потоки.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
13.11.2022, 16:35
Цитата Сообщение от TeBrado Посмотреть сообщение
Решение вроде использовать другой поток
Он используется:
C#
1
Task.Run(() =>
0
548 / 355 / 120
Регистрация: 17.08.2014
Сообщений: 1,351
13.11.2022, 17:21
Maxi4ek8, таски выполняются асинхронно, в вашем случае таска начинает выполнятся когда вы желаете получить результат строка 26, причем это выполнение не потокобезопасно, и выполняется оно синхронно, как раз когда идет перебор в цикле. При этом ваш метод в данном контексте абсолютно бесполезен.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
13.11.2022, 18:00
Цитата Сообщение от Andreyip Посмотреть сообщение
в вашем случае таска начинает выполнятся когда вы желаете получить результат строка 26
Нет, таска начинает выполняться сразу же.
В 26 строке будет блокирующее ожидание ее окончания, а не запуск.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.11.2022, 18:00
Помогаю со студенческими работами здесь

Почему мы должны использовать XMLHttpRequest асинхронно
Блокирует поток UI или что? Кто Знает подскажите. За ранее спасибо.

Почему не выполняются условия
Доброго времени уважаемые форумчане! Подскажите в чем может быть проблема - не выполняются простые условия на показ менюшки на сайте. ...

Не выполняются действия в методах. Почему?
Итак, я пишу шифрование методом аналитических преобразований. Создал NewMDIApplication. По кнопке я вызываю первый метод подобным...

Почему не выполняются все действия?
program Katya_pinokio; var a: array of longint; p: integer; bmv: longint; z: real; l: real; y: longint; ...

Комбобокс - почему не выполняются условия
Всем привет!Смысл в чем: void __fastcall TForm2::ComboBox1Select(TObject *Sender) { if(ComboBox1-&gt;ItemIndex==0)...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере нетипового документа выдачи шин для спецтехники с табличной частью, разработанного в конфигурации КА2. Данные берутся из. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru