Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah TPL Dataflow Boleh Mengehadkan Tugas Asynchronous Serentak?
Gunakan TPL Dataflow untuk mengehadkan bilangan tugas tak segerak serentak
Artikel ini meneroka cara menggunakan TPL Dataflow untuk mengehadkan bilangan tugas tak segerak serentak dengan cekap sambil memanfaatkan sepenuhnya rangkaian berbilang benang. Berbanding dengan pendekatan BlockingCollection
menggunakan SemaphoreSlim
dan ThrottleTasksAsync
, TPL Dataflow menyediakan penyelesaian yang lebih bersih.
Dengan mengkonfigurasi atribut TransformBlock
MaxDegreeOfParallelism
, kami boleh menentukan secara langsung bilangan maksimum tugasan yang dilaksanakan serentak. Tambahkan URL pada TransformBlock
dan ia akan mengendalikannya secara tidak segerak. Setelah pemprosesan selesai, hasilnya tersedia.
<code class="language-csharp">var downloader = new TransformBlock<string, HttpResponse>( url => Download(url), new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = 50 } ); var buffer = new BufferBlock<HttpResponse>(); downloader.LinkTo(buffer); foreach (var url in urls) downloader.Post(url); downloader.Complete(); await downloader.Completion; IList<HttpResponse> responses; if (buffer.TryReceiveAll(out responses)) { // 处理结果 }</code>
Perlu diingat bahawa TransformBlock
menampan input dan output. Oleh itu, kami menyambungkannya dengan BufferBlock
untuk mengelakkan TransformBlock
daripada menyekat sehingga semua item keluaran digunakan. Kaedah BufferBlock.TryReceiveAll
digunakan untuk mendapatkan semula semua keputusan selepas TransformBlock
selesai.
Atas ialah kandungan terperinci Bagaimanakah TPL Dataflow Boleh Mengehadkan Tugas Asynchronous Serentak?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!