Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah TPL Dataflow Boleh Mengehadkan Tugas Asynchronous Serentak?

Bagaimanakah TPL Dataflow Boleh Mengehadkan Tugas Asynchronous Serentak?

Mary-Kate Olsen
Mary-Kate Olsenasal
2025-01-22 20:22:12544semak imbas

How Can TPL Dataflow Limit Concurrent Asynchronous Tasks?

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!

Kenyataan:
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