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 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>
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.
Walaupun kaedah ThrottleTasksAsync menyediakan penyelesaian, aliran data TPL menyediakan pendekatan yang lebih elegan. Khususnya, kelas 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>
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!