Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk secara serentak menjalankan kaedah tugas async di C#?
bagaimana untuk menjalankan asynchronous dalam kaedah C#
Task<T>
) 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>
, yang akan menyekat benang panggilan sehingga tugas selesai. Walau bagaimanapun, dalam beberapa kes, ini akan menyebabkan masalah pembekuan dan prestasi UI. Task.Wait()
. Walaupun ia berbunyi untuk menjalankan tugas secara serentak, jika tugas itu tidak terikat kepada Suruhanjaya, ia sebenarnya akan membuang pengecualian. Task.RunSynchronously()
dari program penjadualan untuk DispatcherFrame
untuk menghentikan pam program penjadualan. Continue
false
penyelesaian yang boleh dipercayai
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>
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!