Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Menggunakan Async/Await dengan Cekap untuk Pelbagai Tugasan Selari dalam C#?

Bagaimanakah Saya Boleh Menggunakan Async/Await dengan Cekap untuk Pelbagai Tugasan Selari dalam C#?

Susan Sarandon
Susan Sarandonasal
2025-01-22 03:21:08194semak imbas

How Can I Efficiently Use Async/Await for Multiple Parallel Tasks in C#?

Gunakan Async/Await dengan cekap untuk mengendalikan berbilang tugas dalam C#

Adegan

Andaikan klien API tak segerak digunakan, yang mengembalikan Tugas atau Tugas, serupa dengan contoh berikut:

<code class="language-csharp">static async Task DoSomething(int siteId, int postId, IBlogClient client)
{
    await client.DeletePost(siteId, postId); // 调用API客户端
    Console.WriteLine("已删除帖子 {0}.", siteId);
}</code>

Matlamatnya adalah untuk memulakan berbilang tugasan tak segerak serentak dan menunggu tugasan itu selesai. Dua kaedah yang biasa digunakan ialah Parallel.ForEach dan Task.WaitAll.

Kekurangan kaedah sedia ada

Walaupun Parallel.ForEach dan Task.WaitSemua kedua-duanya cuba melaksanakan tugasan secara selari, mereka mempunyai had.

  • Parallel.ForEach with Wait(): Walaupun tugasan dilaksanakan serentak, panggilan Wait() menyekat setiap urutan yang mengambil bahagian. Jadi, jika panggilan rangkaian dalam tugasan mengambil masa 2 saat, setiap utas kekal melahu pada masa itu, mengurangkan kecekapan.
  • Task.WaitAll: Sekali lagi, kaedah ini menyekat urutan semasa sehingga tugasan selesai. Dalam tempoh penyekatan ini, benang tidak dapat mengendalikan tugas lain.

Kaedah yang disyorkan

Untuk mengatasi had ini, kami mengesyorkan menggunakan Task.WhenAll, yang boleh melaksanakan tugasan secara tidak segerak dan selari. Kod berikut menunjukkan penggunaannya:

<code class="language-csharp">public async Task DoWork() {

    int[] ids = new[] { 1, 2, 3, 4, 5 };
    await Task.WhenAll(ids.Select(i => DoSomething(1, i, blogClient)));
}</code>

Dalam kes ini, kerana tiada operasi susulan selepas tugasan selesai, menunggu tidak diperlukan. Kod ringkas berikut sudah memadai:

<code class="language-csharp">public Task DoWork() 
{
    int[] ids = new[] { 1, 2, 3, 4, 5 };
    return Task.WhenAll(ids.Select(i => DoSomething(1, i, blogClient)));
}</code>

Untuk mendapatkan lebih banyak cerapan dan perbandingan pendekatan ini, lihat catatan blog yang komprehensif: "Cara dan Tempat Menggunakan API Web ASP.NET untuk I/O Asynchronous Serentak".

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menggunakan Async/Await dengan Cekap untuk Pelbagai Tugasan Selari dalam C#?. 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