Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Saya Boleh Mendikit Tugas Asynchronous dalam C#?

Bagaimanakah Saya Boleh Mendikit Tugas Asynchronous dalam C#?

Susan Sarandon
Lepaskan: 2025-01-22 20:26:10
asal
968 orang telah melayarinya

How Can I Throttle Asynchronous Tasks in C#?

Hadkan tugas tak segerak

Dalam pengaturcaraan tak segerak, selalunya perlu mengehadkan bilangan tugas serentak yang boleh dilaksanakan pada bila-bila masa untuk mencapai pendikitan. Ini amat berguna apabila membuat berbilang panggilan API atau memproses set data yang besar.

Kaedah ThrottleTasksAsync

Kaedah sambungan ThrottleTasksAsync yang disediakan menyelesaikan situasi ini. Ia menerima pengiraan projek, bilangan maksimum tugas serentak, dan fungsi penciptaan tugas. Ia menggunakan BlockingCollection dan SemaphoreSlim untuk menguatkuasakan pendikit.

<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>
Salin selepas log masuk

Kaedah ini menjalankan pendikit pada benang berasingan, menggunakan SemaphoreSlim untuk mengawal bilangan tugasan serentak. Ia juga menggunakan Parallel.ForEach untuk mencapai parallelization, dalam tahap paralelisme tertentu.

Aliran data TPL sebagai alternatif

Walaupun kaedah ThrottleTasksAsync menyediakan penyelesaian, aliran data TPL menyediakan pendekatan yang lebih elegan. Khususnya, kelas TransformBlock boleh digunakan untuk menentukan had selari maksimum untuk pelaksanaan tugas.

<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>
Salin selepas log masuk

Dengan memautkan TransformBlock ke BufferBlock, penyiapan blok tidak disekat oleh ketersediaan pengguna. Ini membolehkan bongkah penimbal untuk mengumpul objek HttpResponse apabila dijana, dan program boleh menunggu untuk pemuat turun selesai sebelum memproses respons.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mendikit Tugas Asynchronous dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan