Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
5 / 5 / 0
Регистрация: 11.09.2021
Сообщений: 578

Что лучше использовать обхода файлов папок: **Parallel.ForEach** или **async-await**?

21.04.2024, 21:03. Показов 938. Ответов 12
Метки c# (Все метки)

Студворк — интернет-сервис помощи студентам
Что лучше использовать обхода файлов папок: Parallel.ForEach или async-await?

В идеале я хотел бы получить список отсортированный как показано ниже.
С минимальным усложнением кода.
Ожидаемый вывод
Кликните здесь для просмотра всего текста

e:\FileDirectoryTest\Directory1
e:\FileDirectoryTest\Directory1\Directory1
e:\FileDirectoryTest\Directory1\Directory2
e:\FileDirectoryTest\Directory1\Directory3
e:\FileDirectoryTest\Directory1\File1.txt
e:\FileDirectoryTest\Directory1\File2.txt
e:\FileDirectoryTest\Directory1\File3.txt
e:\FileDirectoryTest\Directory2
e:\FileDirectoryTest\Directory2\Directory1
e:\FileDirectoryTest\Directory2\Directory2
e:\FileDirectoryTest\Directory2\Directory3
e:\FileDirectoryTest\Directory3
e:\FileDirectoryTest\Directory3\File1.txt
e:\FileDirectoryTest\Directory3\File2.txt
e:\FileDirectoryTest\Directory3\File3.txt
e:\FileDirectoryTest\File1.txt


Как формируются текущие выводы см. ниже

Темы изучил, но не доходит... Запутался..
Темы:
- Разница между асинхронным, многопоточным и параллельным программированиями
- Как устроено синхронное и асинхронное чтение файлов?

Main
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
internal class Program
{
    static async Task Main(string[] args)
    {
        string currentDir = @"e:\FileDirectoryTest";
        // Solut-1
        EnumerationFileDirectoryService enumerationFileDirectoryService = new EnumerationFileDirectoryService();
        enumerationFileDirectoryService.Start(currentDir);
        // Solut-2
        DirectoryProcessor directoryProcessor = new DirectoryProcessor();
        await directoryProcessor.ProcessDirectoriesAndFilesAsync(currentDir);
    }
}




Solut-1. Parallel.ForEach.
Код кратко
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 if (files.Length < procCount)
{
    foreach (var file in files)
    {
        displayFileName(file);
        fileCount++;
    }
}
else
{
    Parallel.ForEach(files, () => 0,
        (file, loopState, localCount) =>
        {
            displayFileName(file);
            return (int)++localCount;
        },
        (c) =>
        {
            Interlocked.Add(ref fileCount, c);
        });
}
Полный код
Кликните здесь для просмотра всего текста

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
 public class EnumerationFileDirectoryService
    {        
        public void Start(string mainPath)
        {
            TraverseTreeParallelForEach(mainPath, DisplayFileName, DisplayDirectoryName);
            Console.ReadKey();
        }
 
 
        public void TraverseTreeParallelForEach(string root, Action<string> displayFileName, Action<string> displayDirectoryName)
        {
            // Count of files traversed and timer for diagnostic output
            int fileCount = 0;
            var sw = Stopwatch.StartNew();
 
            // Determine whether to parallelize file processing on each folder based on processor count.
            int procCount = Environment.ProcessorCount;
 
            // Data structure to hold names of subfolders to be examined for files.
            Stack<string> dirs = new Stack<string>();
 
            if (!Directory.Exists(root))
            {
                throw new ArgumentException(
                    "The given root directory doesn't exist.", nameof(root));
            }
            dirs.Push(root);
 
            while (dirs.Count > 0)
            {
                string currentDir = dirs.Pop();
                string[] subDirs = { };
                string[] files = { };
 
                #region GetDirectories                
                subDirs = Directory.GetDirectories(currentDir);
                #endregion
 
                #region foreach - Directory                
                foreach (var item in subDirs)
                {
                    Console.WriteLine(item);
                }
                #endregion
 
                #region GetFiles                
                files = Directory.GetFiles(currentDir);
 
                #endregion
 
                #region foreach - files                                
                // Execute in parallel if there are enough files in the directory.
                // Otherwise, execute sequentially.Files are opened and processed
                // synchronously but this could be modified to perform async I/O.              
                if (files.Length < procCount)
                {
                    foreach (var file in files)
                    {
                        displayFileName(file);
                        fileCount++;
                    }
                }
                else
                {
                    Parallel.ForEach(files, () => 0,
                        (file, loopState, localCount) =>
                        {
                            displayFileName(file);
                            return (int)++localCount;
                        },
                        (c) =>
                        {
                            Interlocked.Add(ref fileCount, c);
                        });
                }
                #endregion
 
                // Push the subdirectories onto the stack for traversal.
                // This could also be done before handing the files.
                foreach (string str in subDirs)
                    dirs.Push(str);
            }
 
            // For diagnostic purposes.
            Console.WriteLine("Processed {0} files in {1} milliseconds", fileCount, sw.ElapsedMilliseconds);
        }
 
        public void DisplayFileName(string filePath)
        {
            Console.WriteLine(filePath);
        }
 
        public void DisplayDirectoryName(string directoryPath)
        {
            Console.WriteLine(directoryPath);
        }
 
    }




Вывод

e:\FileDirectoryTest\Directory1
e:\FileDirectoryTest\Directory2
e:\FileDirectoryTest\Directory3
e:\FileDirectoryTest\File1.txt
e:\FileDirectoryTest\Directory3\File1.txt
e:\FileDirectoryTest\Directory3\File2.txt
e:\FileDirectoryTest\Directory3\File3.txt
e:\FileDirectoryTest\Directory2\Directory1
e:\FileDirectoryTest\Directory2\Directory2
e:\FileDirectoryTest\Directory2\Directory3
e:\FileDirectoryTest\Directory1\Directory1
e:\FileDirectoryTest\Directory1\Directory2
e:\FileDirectoryTest\Directory1\Directory3
e:\FileDirectoryTest\Directory1\File1.txt
e:\FileDirectoryTest\Directory1\File2.txt
e:\FileDirectoryTest\Directory1\File3.txt
Processed 7 files in 204 milliseconds




Solut-2 async-await
Код кратко
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
private async Task ProcessDirectoryAsync(string directory, List<string> filesAndDirectories)
{
    if (File.GetAttributes(entry).HasFlag(FileAttributes.Directory))
    {
        filesAndDirectories.Add(entry);
        tasks.Add(Task.Run(async () =>
                await ProcessDirectoryAsync(entry, filesAndDirectories)));
    }
    else
    {
        filesAndDirectories.Add(entry);
    }
}


Полный код
Кликните здесь для просмотра всего текста

class DirectoryProcessor
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
internal class DirectoryProcessor
{
    public async Task ProcessDirectoriesAndFilesAsync(string rootDirectory)
    {
        FileDirectoryProcessor fileDirectoryProcessor = new FileDirectoryProcessor();
 
        List<string> filesAndDirectories = await fileDirectoryProcessor.GetFilesAndDirectoriesAsync(rootDirectory);
 
        Console.WriteLine("List of files and directories:");
 
        foreach (var item in filesAndDirectories)
        {
            Console.WriteLine(item);
        }
        
        Console.ReadKey();
    }
}

class FileDirectoryProcessor
GetFilesAndDirectoriesAsync(string rootDirectory)
C#
1
2
3
4
5
6
public async Task<List<string>> GetFilesAndDirectoriesAsync(string rootDirectory)
{
    List<string> filesAndDirectories = new List<string>();
    await ProcessDirectoryAsync(rootDirectory, filesAndDirectories);
    return filesAndDirectories;
}
ProcessDirectoryAsync(string directory, List<string> filesAndDirectories)
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
private async Task ProcessDirectoryAsync(string directory, List<string> filesAndDirectories)
{
    string[] entries = Directory.GetFileSystemEntries(directory);
 
    List<Task> tasks = new List<Task>();
 
    foreach (var entry in entries)
    {
        if (File.GetAttributes(entry).HasFlag(FileAttributes.Directory))
        {
            filesAndDirectories.Add(entry);
            tasks.Add(Task.Run(async () =>
                    await ProcessDirectoryAsync(entry, filesAndDirectories)));
        }
        else
        {
            filesAndDirectories.Add(entry);
        }
    }
 
    await Task.WhenAll(tasks);
}


Вывод

List of files and directories:
e:\FileDirectoryTest\Directory1
e:\FileDirectoryTest\Directory2
e:\FileDirectoryTest\Directory3
e:\FileDirectoryTest\File1.txt
e:\FileDirectoryTest\Directory2\Directory1
e:\FileDirectoryTest\Directory1\Directory1
e:\FileDirectoryTest\Directory2\Directory2
e:\FileDirectoryTest\Directory2\Directory3
e:\FileDirectoryTest\Directory1\Directory2
e:\FileDirectoryTest\Directory1\Directory3
e:\FileDirectoryTest\Directory1\File1.txt
e:\FileDirectoryTest\Directory1\File2.txt
e:\FileDirectoryTest\Directory1\File3.txt
e:\FileDirectoryTest\Directory3\File1.txt
e:\FileDirectoryTest\Directory3\File2.txt
e:\FileDirectoryTest\Directory3\File3.txt
Processed in 162 milliseconds





Дерево папок

e:\FileDirectoryTest>tree /f /a
Структура папок
E:.
| File1.txt
|
+---Directory1
| | File1.txt
| | File2.txt
| | File3.txt
| |
| +---Directory1
| +---Directory2
| \---Directory3
+---Directory2
| +---Directory1
| +---Directory2
| \---Directory3
\---Directory3
File1.txt
File2.txt
File3.txt
1
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.04.2024, 21:03
Ответы с готовыми решениями:

Parallel.ForEach & async Sockets
Доброго времени суток, столкнулся с такой проблемой. Пишу сканер портов и дабы ускорить его работу использую Parallel.For и асинхронные...

Использовать асинхронную функцию (async/await) или же синхронную функцию, вызвав через Task.Run?
Использовать асинхронную функцию (async/await) или же синхронную функцию, вызвав через Task.Run? Всем привет. Использовать асинхронную...

Получение данных из Parallel.For или Parallel.ForEach
Есть некоторый список с исходными данными (данные не зависят друг от друга). Исходя из этих данных необходимо провести некоторые вычисления...

12
 Аватар для XIST
1960 / 1061 / 148
Регистрация: 01.10.2009
Сообщений: 3,589
Записей в блоге: 1
22.04.2024, 10:08
dev3214, ну так а что быстрее отрабатывает? замерьте, и вы же понимаете, у вас будет одни числа, у меня на моем ПК другие
1
5 / 5 / 0
Регистрация: 11.09.2021
Сообщений: 578
22.04.2024, 11:37  [ТС]
Цитата Сообщение от XIST Посмотреть сообщение
dev3214, ну так а что быстрее отрабатывает? замерьте, и вы же понимаете, у вас будет одни числа, у меня на моем ПК другие
По скорости вроже одинаково.
Solut-1-Parallel.ForEach - 204 milliseconds;
Solut-2-async-await" - 162 milliseconds.

Я думал может для работы с файлами/папками есть какие-то особенности...

Или можно то и то применять?
На усмотрение разработчика...
0
 Аватар для XIST
1960 / 1061 / 148
Регистрация: 01.10.2009
Сообщений: 3,589
Записей в блоге: 1
22.04.2024, 12:11
dev3214, различия есть, но я думаю в вашем вопросе нет разницы, дело в том, что Parallel.ForEach позволяет выполнять задачи параллельно на нескольких потоках, но жрет ресурсы сильно, насколько я знаю. А async-await может выполнять долгие операции без блокировки потоков и жора ресурсов, опять же, ваш пример это ерунда, нужно намного более серьезные операции что бы это проверить
1
5 / 5 / 0
Регистрация: 11.09.2021
Сообщений: 578
22.04.2024, 12:35  [ТС]
Цитата Сообщение от XIST Посмотреть сообщение
dev3214, различия есть, но я думаю в вашем вопросе нет разницы, дело в том, что Parallel.ForEach позволяет выполнять задачи параллельно на нескольких потоках, но жрет ресурсы сильно, насколько я знаю. А async-await может выполнять долгие операции без блокировки потоков и жора ресурсов, опять же, ваш пример это ерунда, нужно намного более серьезные операции что бы это проверить
Допустим в папке будет 10 тыс - 15 тыс папок/файлов.
С различной степенью вложенности...

Тогда применение Parallel.ForEach или async-await не принципиально?
0
 Аватар для XIST
1960 / 1061 / 148
Регистрация: 01.10.2009
Сообщений: 3,589
Записей в блоге: 1
22.04.2024, 12:36
Цитата Сообщение от dev3214 Посмотреть сообщение
Тогда применение Parallel.ForEach или async-await не принципиально?
зависит от машины уже
1
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
22.04.2024, 12:40
Дичь какая то. Есть встроенные методы делающие то же самое
Например https://learn.microsoft.com/en... archoption)
Обрати внимание на параметр SearchOption. Нужно указать SearchOption.All для рекурсивного поиска.
2
 Аватар для IamRain
4693 / 2701 / 734
Регистрация: 02.08.2011
Сообщений: 7,226
22.04.2024, 12:45
Цитата Сообщение от XIST Посмотреть сообщение
Parallel.ForEach позволяет выполнять задачи параллельно на нескольких потоках, но жрет ресурсы сильно, насколько я знаю.
Методы класса Parallel в плане производительности как раз-таки являются "красавчиками" - запускается один поток, который берет на себя блок итераций, schedule-ится следующий на следующий блок итераций и все время мониторится загрузка. Если работа закончена, то уже за-schedule-нные таски отменяются.
То есть они не торопятся повышать concurrency, а делают это осторожно. Как-то так. За полным ответом - надо лезть в исходники.
Если верить отцам-основателям.

Добавлено через 5 минут
А правильный ответ выше дан - не надо ничего выдумывать, есть готовое API, которое проверено временем и работает оптимально, имхо.
1
5 / 5 / 0
Регистрация: 11.09.2021
Сообщений: 578
22.04.2024, 13:42  [ТС]
Цитата Сообщение от nicolas2008 Посмотреть сообщение
Дичь какая то. Есть встроенные методы делающие то же самое
Например https://learn.microsoft.com/en... archoption)
Обрати внимание на параметр SearchOption. Нужно указать SearchOption.All для рекурсивного поиска.
Я от этого отталкивался: Практическое руководство. Перебор каталогов с файлами с помощью параллельного класса

А потом понеслась... Таски, асинки...

Код кратко
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
if (files.Length < procCount)
{
    foreach (var file in files)
    {
        action(file);
        fileCount++;
    }
}
else
{
    Parallel.ForEach(files, () => 0,
    (file, loopState, localCount) =>
    {
        action(file);
        return (int)++localCount;
    },
    (c) =>
    {
        Interlocked.Add(ref fileCount, c);
    });
}

Код из документации.
Кликните здесь для просмотра всего текста
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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Security;
using System.Threading;
using System.Threading.Tasks;
 
class Program
{
    static void Main()
    {
        try
        {
            TraverseTreeParallelForEach(@"C:\Program Files", (f) =>
            {
                // Exceptions are no-ops.
                try
                {
                    // Do nothing with the data except read it.
                    byte[] data = File.ReadAllBytes(f);
                }
                catch (FileNotFoundException) { }
                catch (IOException) { }
                catch (UnauthorizedAccessException) { }
                catch (SecurityException) { }
                // Display the filename.
                Console.WriteLine(f);
            });
        }
        catch (ArgumentException)
        {
            Console.WriteLine(@"The directory 'C:\Program Files' does not exist.");
        }
 
        // Keep the console window open.
        Console.ReadKey();
    }
 
    public static void TraverseTreeParallelForEach(string root, Action<string> action)
    {
        //Count of files traversed and timer for diagnostic output
        int fileCount = 0;
        var sw = Stopwatch.StartNew();
 
        // Determine whether to parallelize file processing on each folder based on processor count.
        int procCount = Environment.ProcessorCount;
 
        // Data structure to hold names of subfolders to be examined for files.
        Stack<string> dirs = new Stack<string>();
 
        if (!Directory.Exists(root))
        {
            throw new ArgumentException(
                "The given root directory doesn't exist.", nameof(root));
        }
        dirs.Push(root);
 
        while (dirs.Count > 0)
        {
            string currentDir = dirs.Pop();
            string[] subDirs = { };
            string[] files = { };
 
            try
            {
                subDirs = Directory.GetDirectories(currentDir);
            }
            // Thrown if we do not have discovery permission on the directory.
            catch (UnauthorizedAccessException e)
            {
                Console.WriteLine(e.Message);
                continue;
            }
            // Thrown if another process has deleted the directory after we retrieved its name.
            catch (DirectoryNotFoundException e)
            {
                Console.WriteLine(e.Message);
                continue;
            }
 
            try
            {
                files = Directory.GetFiles(currentDir);
            }
            catch (UnauthorizedAccessException e)
            {
                Console.WriteLine(e.Message);
                continue;
            }
            catch (DirectoryNotFoundException e)
            {
                Console.WriteLine(e.Message);
                continue;
            }
            catch (IOException e)
            {
                Console.WriteLine(e.Message);
                continue;
            }
 
            // Execute in parallel if there are enough files in the directory.
            // Otherwise, execute sequentially.Files are opened and processed
            // synchronously but this could be modified to perform async I/O.
            try
            {
                if (files.Length < procCount)
                {
                    foreach (var file in files)
                    {
                        action(file);
                        fileCount++;
                    }
                }
                else
                {
                    Parallel.ForEach(files, () => 0,
                        (file, loopState, localCount) =>
                        {
                            action(file);
                            return (int)++localCount;
                        },
                        (c) =>
                        {
                            Interlocked.Add(ref fileCount, c);
                        });
                }
            }
            catch (AggregateException ae)
            {
                ae.Handle((ex) =>
                {
                    if (ex is UnauthorizedAccessException)
                    {
                        // Here we just output a message and go on.
                        Console.WriteLine(ex.Message);
                        return true;
                    }
                    // Handle other exceptions here if necessary...
 
                    return false;
                });
            }
 
            // Push the subdirectories onto the stack for traversal.
            // This could also be done before handing the files.
            foreach (string str in subDirs)
                dirs.Push(str);
        }
 
        // For diagnostic purposes.
        Console.WriteLine("Processed {0} files in {1} milliseconds", fileCount, sw.ElapsedMilliseconds);
    }
}
0
Эксперт .NET
 Аватар для Usaga
14087 / 9305 / 1348
Регистрация: 21.01.2016
Сообщений: 34,944
22.04.2024, 16:42
dev3214, скорость доступа к накопителю на порядки ниже скорости работы процессора и оперативки. Это значит, что всякие попытки распараллеливания приведут ни к чему. Просто потоки будут делить между собой пропускную способность интерфейса SATA\PCI-E поровну.

Добавлено через 20 секунд
Цитата Сообщение от nicolas2008 Посмотреть сообщение
Например https://learn.microsoft.com/en... archoption)
Обрати внимание на параметр SearchOption. Нужно указать SearchOption.All для рекурсивного поиска.
Оно работает только до первого исключения.
1
5 / 5 / 0
Регистрация: 11.09.2021
Сообщений: 578
22.04.2024, 17:57  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
dev3214, скорость доступа к накопителю на порядки ниже скорости работы процессора и оперативки. Это значит, что всякие попытки распараллеливания приведут ни к чему. Просто потоки будут делить между собой пропускную способность интерфейса SATA\PCI-E поровну.
Я сразу не заметил...
По сути вопрос сводится к скорости заполнения списка.
Parallel.ForEach не быстрее ForEach?
Если я правильно понял, Parallel.ForEach по ядрам раскидывает..
ForEach не распределяет операции по ядрам?

Если async-await не увеличивает скорость заполнения списка, то async-await нужно использовать чтобы не блокировать UI при больших объёмах.
Так?


Или не заморачиваться и просто сделать async-await чтобы не блокировать UI при работе?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
private async Task ProcessDirectoryAsync(string directory, List<string> filesAndDirectories)
{
    string[] entries = Directory.GetFileSystemEntries(directory);
 
    List<Task> tasks = new List<Task>();
 
    foreach (var entry in entries)
    {
        if (File.GetAttributes(entry).HasFlag(FileAttributes.Directory))
        {
            filesAndDirectories.Add(entry);
            tasks.Add(Task.Run(async () =>
                    await ProcessDirectoryAsync(entry, filesAndDirectories)));
        }
        else
        {
            filesAndDirectories.Add(entry);
        }
    }
 
    await Task.WhenAll(tasks);
}
0
 Аватар для xellan24rus
364 / 296 / 55
Регистрация: 08.04.2020
Сообщений: 1,173
22.04.2024, 18:26
dev3214, распараллеливать поиск файлов нет смысла, так как при большом поиске этого ничего не даст. Ведь когда вы достигните пика пропускной способности диска, быстрее читаться ничего не будет, а лишняя нагрузка избыточная появится. Используйте стандартные методы как описали выше или рекурсивный обход и запускайте вашу задачу асинхронно.
Также стоит учитывать что List и другие коллекции заполняют озу, при поиске в 40 миллионов можно достигнуть отметки 20гб озу съедено. Лучше на ходу делайте обработку данных, без заполнения озу без резкой причины.

Добавлено через 51 секунду
Цитата Сообщение от xellan24rus Посмотреть сообщение
при поиске в 40 миллионов можно достигнуть отметки 20гб озу съедено
Это с тем учетом если вы сохраняете в коллекцию.
1
Эксперт .NET
 Аватар для Usaga
14087 / 9305 / 1348
Регистрация: 21.01.2016
Сообщений: 34,944
23.04.2024, 05:19
Цитата Сообщение от dev3214 Посмотреть сообщение
Или не заморачиваться и просто сделать async-await чтобы не блокировать UI при работе?
Именно. Асинхронность ничего не ускоряет. Это не параллелизм.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.04.2024, 05:19
Помогаю со студенческими работами здесь

Как использовать async и await
Почему-то async и await не ни в какую не хотят работать... Ошибка CS1061 'Task&lt;string&gt;&quot; не содержит определения для...

Многопоточность: когда и почему лучше использовать thread или async?
Подскажите, пожалуйста, когда и почему лучше использовать thread или async?

Как правильно использовать async await
Здравствуйте! Есть программа, где вывод должен осуществляться при каждой итерации цикла, но этого не происходит. Весь результат выводится...

Оператор await можно использовать только в методах с модификатором async
Здравствуйте, нашел хороший геокодер, но не смог в нем разобраться даже при наличии примера. (вставил кусок из примера к себе в код) ...

Как использовать async/await в запросах SQL чтобы форма не зависала
Привет, когда нажимаю войти в авторизации то зависает форма, иногда до минуты надо ждать... Помогите это исправить чтобы по быстрей...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru