>백엔드 개발 >C++ >C#에서 비동기 작업을 어떻게 조절할 수 있나요?

C#에서 비동기 작업을 어떻게 조절할 수 있나요?

Susan Sarandon
Susan Sarandon원래의
2025-01-22 20:26:10971검색

How Can I Throttle Asynchronous Tasks in C#?

비동기 작업 제한

비동기 프로그래밍에서는 제한을 달성하기 위해 특정 시간에 실행할 수 있는 동시 작업 수를 제한해야 하는 경우가 많습니다. 이는 여러 API를 호출하거나 대규모 데이터 세트를 처리할 때 특히 유용합니다.

ThrottleTasksAsync 메서드

제공된 ThrottleTasksAsync 확장 메서드는 이러한 상황을 해결합니다. 프로젝트 열거, 최대 동시 작업 수 및 작업 생성 기능을 허용합니다. BlockingCollection 및 SemaphoreSlim을 활용하여 제한을 적용합니다.

<code class="language-c#">public static async Task<result_t> ThrottleTasksAsync<enumerable_t, result_t>(
    this IEnumerable<enumerable_t> enumerable,
    int maxConcurrentTasks,
    int maxDegreeOfParallelism,
    Func<enumerable_t, Task> taskToRun)
{
    // ...
}</code>

이 방법은 동시 작업 수를 제어하기 위해 SemaphoreSlim을 사용하여 별도의 스레드에서 조절을 실행합니다. 또한 지정된 병렬 처리 수준 내에서 병렬화를 달성하기 위해 Parallel.ForEach를 활용합니다.

대안으로 TPL 데이터 흐름

ThrottleTasksAsync 메서드가 솔루션을 제공하는 반면 TPL 데이터 흐름은 보다 우아한 접근 방식을 제공합니다. 특히, TransformBlock 클래스는 작업 실행에 대한 최대 병렬 처리 한계를 정의하는 데 사용될 수 있습니다.

<code class="language-c#">var downloader = new TransformBlock<string, HttpResponse>(
    url => Download(url),
    new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = 50 });

var buffer = new BufferBlock<HttpResponse>();
downloader.LinkTo(buffer);</code>

TransformBlock을 BufferBlock에 연결하면 소비자 가용성으로 인해 블록 완료가 차단되지 않습니다. 이를 통해 버퍼 청크는 생성 시 HttpResponse 개체를 수집할 수 있으며 프로그램은 응답을 처리하기 전에 다운로더가 완료될 때까지 기다릴 수 있습니다.

위 내용은 C#에서 비동기 작업을 어떻게 조절할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.