@jett
Многопоточность - это способность программы или операционной системы выполнять несколько потоков одновременно.
В C# многопоточность можно реализовать с помощью класса Thread или с использованием асинхронного программирования с использованием ключевых слов async и await.
Рассмотрим оба варианта:
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 |
using System; using System.Threading; class Program { static void Main() { // Создание нового потока и передача ему метода для выполнения Thread thread = new Thread(WorkerMethod); // Запуск потока thread.Start(); // Главный поток может продолжать работу параллельно for (int i = 0; i < 5; i++) { Console.WriteLine("Главный поток: {0}", i); Thread.Sleep(1000); } // Ожидание завершения вторичного потока thread.Join(); Console.WriteLine("Работа завершена"); } static void WorkerMethod() { for (int i = 0; i < 5; i++) { Console.WriteLine("Вторичный поток: {0}", i); Thread.Sleep(1000); } } } |
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 |
using System; using System.Threading.Tasks; class Program { static async Task Main() { // Выполнение метода WorkerMethod асинхронно Task workerTask = WorkerMethod(); // Главный поток может продолжать работу параллельно for (int i = 0; i < 5; i++) { Console.WriteLine("Главный поток: {0}", i); await Task.Delay(1000); } // Ожидание завершения асинхронного метода await workerTask; Console.WriteLine("Работа завершена"); } static async Task WorkerMethod() { for (int i = 0; i < 5; i++) { Console.WriteLine("Вторичный поток: {0}", i); await Task.Delay(1000); } } } |
Оба варианта позволяют выполнять несколько задач параллельно, улучшая производительность программы.
@jett
Многопоточность (concurrency) - это концепция разделения задач на множество независимых частей, которые могут выполняться параллельно на нескольких потоках. Использование многопоточности позволяет повысить производительность и улучшить отзывчивость программы.
В C# многопоточность может быть реализована следующими способами:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
using System; using System.Threading; class Program { static void Main() { Thread thread = new Thread(DoWork); thread.Start(); // Продолжение работы основного потока } static void DoWork() { // Выполнение работы в отдельном потоке } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
using System; using System.Threading.Tasks; class Program { static void Main() { DoWorkAsync(); // Продолжение работы основного потока } static async Task DoWorkAsync() { // Выполнение работы в отдельном потоке } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
using System; using System.Threading; class Program { static void Main() { ThreadPool.QueueUserWorkItem(DoWork); // Продолжение работы основного потока } static void DoWork(object state) { // Выполнение работы в отдельном потоке } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
using System; using System.Threading; using System.Threading.Tasks; using System.Linq; class Program { static void Main() { int[] numbers = Enumerable.Range(1, 1000000).ToArray(); Parallel.ForEach(numbers, number => { // Обработка каждого числа в отдельном потоке }); // Продолжение работы основного потока } } |
Независимо от выбранного способа, при работе с многопоточностью следует учитывать возможность синхронизации доступа к общим ресурсам и избегать состояний гонки (race conditions).