본문 바로가기

task

C# ValueTask와 Task 성능 비교 및 활용 전략 C#에서 비동기 프로그래밍 시 Task와 ValueTask는 자주 사용되는 두 가지 타입입니다. 각각의 특징과 성능 차이를 이해하면 더 효율적인 코드를 작성할 수 있습니다.1. Task와 ValueTask 개요Task는 비동기 작업의 기본 단위로, 오랫동안 사용되어온 대표적인 비동기 타입입니다. 반면 ValueTask는 비교적 최근에 도입되었으며, 불필요한 할당 비용을 줄여 성능을 향상시키기 위해 설계되었습니다.2. 성능 차이Task는 힙 할당이 발생해 가비지 컬렉션 부담이 있지만, ValueTask는 구조체로 스택에 할당되어 할당 비용이 줄어듭니다. 하지만 ValueTask는 여러 번 await 하면 상태 관리가 복잡해질 수 있어 주의가 필요합니다.3. 사용 사례간단한 캐시 조회나 즉시 완료 가능한 결.. 더보기
C# Custom SynchronizationContext 구현하기 비동기와 UI 스레드의 문맥 제어를 이해하면 안정적인 C# 코드를 작성할 수 있습니다. SynchronizationContext는 await 이후의 실행 위치를 결정하는 핵심 추상화이며, 직접 구현하면 전용 스레드에서 순차 실행, 테스트용 가상 UI 루프, 제한된 동시성 큐 등 다양한 시나리오를 만들 수 있습니다.1. SynchronizationContext란?SynchronizationContext는 작업을 특정 문맥으로 마샬링하는 추상 타입입니다. WinForms/WPF는 UI 스레드로, ASP.NET은 요청 문맥으로, 기본 스레드풀에서는 특별한 제약 없이 실행합니다. await는 기본적으로 현재 SynchronizationContext를 캡처해 이어서 실행합니다.2. 언제 커스텀 구현이 필요한가단일.. 더보기
C# 스레드 풀(ThreadPool)과 작업 큐(Task Queue) 이해하기 스레드는 프로그램의 작업 단위를 의미하며, 많은 스레드를 직접 관리하는 것은 복잡하고 비효율적일 수 있습니다. C#에서는 ThreadPool과 작업 큐(Task Queue)를 통해 효율적인 스레드 관리를 제공합니다.1. ThreadPool이란?ThreadPool은 재사용 가능한 스레드 모음으로, 필요할 때마다 새로운 스레드를 생성하지 않고 관리함으로써 성능 저하를 줄입니다. 작업을 스레드 풀에 큐에 넣으면 스레드 풀에서 알맞은 스레드를 할당해 작업을 실행합니다.2. 작업 큐(Task Queue)는 무엇인가?작업 큐는 실행 대기 중인 작업이 저장되는 공간입니다. C#에서는 Task 클래스를 사용해 비동기 작업을 생성하고 큐에 넣어 처리합니다. 이를 통해 UI 스레드 차단 없이 백그라운드 작업 처리가 가능해.. 더보기
C# CancellationToken으로 작업 취소 구현하기 CancellationToken은 비동기/병렬 작업을 ‘협조적’으로 취소하기 위한 표준 도구입니다. 토큰을 메서드에 전달하고, 해당 메서드가 수시로 토큰을 확인해 스스로 중단하도록 설계합니다.1. 기본 사용법CancellationTokenSource로 토큰을 만들고 메서드에 전달합니다. 작업 내에서는 ThrowIfCancellationRequested 또는 IsCancellationRequested를 사용해 주기적으로 확인합니다.using System;using System.Threading;using System.Threading.Tasks;static async Task DoWorkAsync(CancellationToken token){ for (int i = 0; i 2. I/O 작업 취소 (.. 더보기
C# Task와 Task<T> 사용법 1. 개념 설명Task는 비동기 작업을 표현하고, Task는 결과 값을 반환하는 비동기 작업입니다. async/await를 사용하면 콜백 없이 비동기 흐름을 동기 코드처럼 읽기 쉽게 작성할 수 있습니다. Task는 스레드 그 자체가 아니라 스케줄러가 실행하는 작업의 약속이며, 완료/예외/취소 상태를 가집니다.2. 코드 예제아래 예제는 Task와 Task를 함께 사용하고, 여러 작업을 Task.WhenAll로 묶어 기다립니다. 콘솔에 진행 상황을 출력해 동작을 확인합니다.using System;using System.Threading.Tasks;static async Task DoWorkAsync(string name, int delayMs){ await Task.Delay(delayMs); C.. 더보기
C# 비동기 프로그래밍 async/await 1. 개념 설명async/await는 비동기 작업을 선언적으로 표현해 I/O 대기 시간을 효율적으로 처리합니다. 메서드를 async로 표시하고 Task/Task를 반환하며, await는 현재 스레드를 차단하지 않고 작업이 완료되면 이어서 실행합니다. 이를 통해 UI 응답성을 유지하고 서버에서 더 많은 동시 요청을 처리할 수 있습니다.2. 코드 예제아래 예제는 웹 페이지 문자열 길이와 인위적 딜레이 작업을 동시에 시작한 뒤 결과를 출력합니다.using System;using System.Net.Http;using System.Threading.Tasks;class Program{ static async Task FetchLengthAsync() { using var client = .. 더보기