728x90
안녕하세요!
이번 글에서는 C#에서 병렬 제어를 다루는 방법에 대해 알아보겠습니다.
병렬 제어는 멀티스레딩과 Task 기반 비동기 처리를 통해 프로그램의 성능을 향상시키고 작업을 효율적으로 처리하는 데 중요한 역할을 합니다.
예제를 통해 두 가지 기법에 대해 구체적으로 살펴보도록 하겠습니다.
멀티스레딩
- 멀티스레딩은 하나의 프로세스에서 여러 개의 스레드를 동시에 실행하여 작업을 병렬적으로 처리하는 방식입니다.
- C#에서 멀티스레딩을 구현하기 위해 System.Threading 네임스페이스를 사용합니다.
using System;
using System.Threading;
public class Program
{
public static void Main()
{
Thread t1 = new Thread(DoWork);
Thread t2 = new Thread(DoWork);
t1.Start();
t2.Start();
t1.Join();
t2.Join();
Console.WriteLine("작업 완료!");
}
public static void DoWork()
{
for (int i = 1; i <= 5; i++)
{
Console.WriteLine($"스레드 ID: {Thread.CurrentThread.ManagedThreadId}, 값: {i}");
Thread.Sleep(100);
}
}
}
- Thread 클래스를 사용하여 간단한 멀티스레딩을 구현하였습니다.
- DoWork 메서드는 간단한 작업을 수행합니다.
- 각 스레드는 1부터 5까지의 값을 출력하며, 작업이 진행되는 동안 100밀리초 딜레이를 주어 스레드 간에 작업의 동시성을 확인할 수 있습니다.
Task 기반 비동기 처리
- Task 기반 비동기 처리는 멀티스레딩을 더 쉽게 사용할 수 있도록 도와주는 기능입니다.
- Task 클래스를 사용하여 비동기 작업을 시작하고 결과를 처리할 수 있습니다.
using System;
using System.Threading.Tasks;
public class Program
{
public static async Task Main()
{
Task t1 = DoWorkAsync();
Task t2 = DoWorkAsync();
await Task.WhenAll(t1, t2);
Console.WriteLine("작업 완료!");
}
public static async Task DoWorkAsync()
{
for (int i = 1; i <= 5; i++)
{
Console.WriteLine($"작업 ID: {i}");
await Task.Delay(100);
}
}
}
- Main 메서드에서 DoWorkAsync를 두 번 호출하고, Task.WhenAll 메서드를 사용하여 두 개의 비동기 작업(t1과 t2)이 모두 완료될 때까지 대기합니다.
- 각 비동기 작업은 1부터 5까지의 값을 출력하며, 작업이 진행되는 동안 100밀리초 딜레이를 주어 비동기 작업의 병렬 처리를 확인할 수 있습니다.
비동기 처리의 장점
- 비동기 처리를 통해 I/O 바운드 작업(파일 입출력, 네트워크 통신 등)을 효율적으로 처리할 수 있습니다.
- 비동기 메서드는 해당 작업이 완료될 때까지 블록되지 않고 다른 작업을 수행할 수 있습니다.
- 멀티스레딩과 비동기 처리는 다중 코어 CPU에서 병렬 처리를 지원하여 CPU 바운드 작업(복잡한 계산 등)의 성능을 향상시킬 수 있습니다.
주의 사항
- 멀티스레딩과 비동기 처리를 사용할 때는 스레드 간 동기화와 관련된 문제들을 고려해야 합니다.
- 공유 자원에 대한 접근을 적절하게 동기화하여 스레드 안정성을 보장해야 합니다.
이번 글에서는 C#에서 병렬 제어를 위한 멀티스레딩과 Task 기반 비동기 처리를 살펴보았습니다.
멀티스레딩과 비동기 처리를 통해 프로그램의 성능을 향상시키고 작업을 효율적으로 처리할 수 있습니다.
하지만 주의 사항을 염두에 두고 사용해야 스레드 안정성을 보장할 수 있습니다.
비동기 처리의 장점을 활용하여 효율적인 프로그래밍을 진행해보시기 바랍니다.
감사합니다!
728x90
'[C#] > 프로그래밍 기초' 카테고리의 다른 글
[C#] 프로그래밍 기초 : foreach (20) | 2023.08.01 |
---|---|
[C#] 프로그래밍 기초 : 프로퍼티 (15) | 2023.07.31 |
[C#] 프로그래밍 기초 : 문자열(String) (22) | 2023.07.13 |
[C#] 프로그래밍 기초 : 유용한 라이브러리 (15) | 2023.06.28 |
[C#] 프로그래밍 기초 : 디자인 패턴 (20) | 2023.06.28 |