Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk secara serentak menjalankan kaedah tugas async di C#?

Bagaimana untuk secara serentak menjalankan kaedah tugas async di C#?

DDD
Lepaskan: 2025-02-01 07:16:08
asal
890 orang telah melayarinya

How to Synchronously Run an Async Task Method in C#?

bagaimana untuk menjalankan asynchronous dalam kaedah C#

? Task<T>

Dalam pengaturcaraan asynchronous, kaedah biasanya ditakrifkan sebagai tugas tak segerak (

) untuk meningkatkan keupayaan prestasi dan tindak balas permohonan. Walau bagaimanapun, dalam beberapa kes, anda mungkin perlu melakukan kaedah asynchronous serentak untuk debug atau ujian. Task<T>

Beberapa kaedah menjalankan kaedah asynchronous

Satu kaedah adalah menggunakan kaedah

, yang akan menyekat benang panggilan sehingga tugas selesai. Walau bagaimanapun, dalam beberapa kes, ini akan menyebabkan masalah pembekuan dan prestasi UI. Task.Wait()

pilihan lain ialah menggunakan kaedah

. Walaupun ia berbunyi untuk menjalankan tugas secara serentak, jika tugas itu tidak terikat kepada Suruhanjaya, ia sebenarnya akan membuang pengecualian. Task.RunSynchronously()

Akhirnya, anda boleh menggunakan penyelesaian yang melibatkan bingkai program penjadualan. Buat baru mulakannya, dan tunggu tugas dalam ekspresi Lambda. Selepas tugas selesai, tetapkan atribut

dari program penjadualan untuk DispatcherFrame untuk menghentikan pam program penjadualan. Continue false penyelesaian yang boleh dipercayai

Penyelesaian yang lebih kuat adalah menggunakan konteks segerak, dan konteksnya akan mengepam mesej sehingga tugas selesai. Ini adalah kelas yang melaksanakan penyelesaian ini:

cara menggunakan:
<code class="language-csharp">public static class AsyncHelpers
{
    /// <summary>
    /// 同步执行具有 void 返回值的异步 Task 方法。
    /// </summary>
    /// <param name="task">要执行的 Task 方法。</param>
    public static void RunSync(Func<Task> task)
    {
        var oldContext = SynchronizationContext.Current;
        var syncContext = new ExclusiveSynchronizationContext();
        SynchronizationContext.SetSynchronizationContext(syncContext);

        syncContext.Post(async _ =>
        {
            try
            {
                await task();
            }
            catch (Exception e)
            {
                syncContext.InnerException = e;
                throw;
            }
            finally
            {
                syncContext.EndMessageLoop();
            }
        }, null);

        syncContext.BeginMessageLoop();

        SynchronizationContext.SetSynchronizationContext(oldContext);
    }

    /// <summary>
    /// 同步执行具有 T 返回类型的异步 Task<T> 方法。
    /// </summary>
    /// <typeparam name="T">返回类型</typeparam>
    /// <param name="task">要执行的 Task<T> 方法。</param>
    /// <returns>等待给定的 Task<T> 的结果。</returns>
    public static T RunSync<T>(Func<Task<T>> task)
    {
        var oldContext = SynchronizationContext.Current;
        var syncContext = new ExclusiveSynchronizationContext();
        SynchronizationContext.SetSynchronizationContext(syncContext);
        T result;

        syncContext.Post(async _ =>
        {
            try
            {
                result = await task();
            }
            catch (Exception e)
            {
                syncContext.InnerException = e;
                throw;
            }
            finally
            {
                syncContext.EndMessageLoop();
            }
        }, null);

        syncContext.BeginMessageLoop();

        SynchronizationContext.SetSynchronizationContext(oldContext);

        return result;
    }

    private class ExclusiveSynchronizationContext : SynchronizationContext
    {
        // ... 为简洁起见省略了实现细节
    }
}</code>
Salin selepas log masuk

Penyelesaian ini berfungsi dengan baik di bawah syarat bahawa kaedah asynchronous diperlukan untuk menjalankan asynchronous.

Atas ialah kandungan terperinci Bagaimana untuk secara serentak menjalankan kaedah tugas async di C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan