Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk mengehadkan operasi async I/O serentak dalam .net?

Bagaimana untuk mengehadkan operasi async I/O serentak dalam .net?

Barbara Streisand
Barbara Streisandasal
2025-02-01 20:46:14668semak imbas

How to Limit Concurrent Async I/O Operations in .NET?

<.> Terhad secara serentak dalam Operasi .NET I/O

Pengaturcaraan Asynchronous memberikan kelebihan yang signifikan untuk tugas selari. Walau bagaimanapun, menguruskan kesesuaian operasi tak segerak ini adalah penting untuk mengelakkan beban sistem. Artikel ini membincangkan masalah biasa yang menyekat bilangan operasi I/O untuk menyekat bilangan operasi I/O untuk memastikan prestasi terbaik.

<:> Soalan:

dengan ketiadaan penggunaan permintaan HTTP tak segerak serentak untuk mendapatkan beberapa URL, tingkah laku lalai adalah untuk membuat sejumlah besar permintaan serentak. Ini boleh menyebabkan keletihan sumber dan penurunan prestasi. Cabarannya adalah untuk mengehadkan kesesuaian ke ambang yang ditentukan, seperti 20 permintaan pada satu masa. Penyelesaian:

.NET 4.5 Beta memperkenalkan jumlah isyarat tak segerak (Semaphoreslim), yang menyediakan kaedah yang berkesan untuk mengawal akses serentak kepada sumber. Kaedah WaitAsync () membolehkan kami menggantung pelaksanaan kaedah tak segerak yang digantung sebelum ini sebelum bilangan slot yang ditentukan.

Kod Contoh:

Dalam kod ini, kaedah Waitasync () memastikan hanya 20 permintaan pada satu masa. Apabila permintaan baru diatur, ia akan menunggu sehingga terdapat alur untuk disediakan.

Penyelesaian alternatif untuk menggunakan penjadualan tugas:

<code class="language-csharp">public async Task MyOuterMethod()
{
    // 要获取的 URL 列表
    string[] urls = { "http://google.com", "http://yahoo.com", ... };

    // 创建一个节流器,将并发性限制为 20 个请求
    SemaphoreSlim throttler = new SemaphoreSlim(initialCount: 20);

    // 初始化一个列表以存储所有异步任务
    var allTasks = new List<Task>();

    // 安排每个 URL 获取任务
    foreach (var url in urls)
    {
        // 等待节流器中的一个槽可用
        await throttler.WaitAsync();

        // 在单独的线程池流中安排任务
        allTasks.Add(
            Task.Run(async () =>
            {
                try
                {
                    using (var client = new HttpClient()) // 使用using语句确保HttpClient被正确释放
                    {
                        var html = await client.GetStringAsync(url);
                    }
                }
                finally
                {
                    // 释放节流器中的槽
                    throttler.Release();
                }
            }));
    }

    // 等待所有任务完成
    await Task.WhenAll(allTasks);
}</code>
Kaedah lain melibatkan penggunaan penjadualan berasaskan TPL untuk membuat tugas mengikat yang ditugaskan. Kemudian anda boleh melaksanakan penjadual tugas tersuai untuk memaksa pelaksanaan sekatan serentak. Untuk maklumat lanjut, lihat Contoh Taskscheduler pada MSDN.

Atas ialah kandungan terperinci Bagaimana untuk mengehadkan operasi async I/O serentak dalam .net?. 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