C#
Task<T>
)として定義されます。ただし、場合によっては、デバッグまたはテストするために同期的に非同期方法を実行する必要がある場合があります。 Task<T>
メソッドを使用することです。ただし、場合によっては、これによりUIの凍結とパフォーマンスの問題が発生します。 Task.Wait()
メソッドを使用することです。タスクを同時に実行するように聞こえますが、タスクが委員会に拘束されない場合、実際に例外がスローされます。 Task.RunSynchronously()
属性をDispatcherFrame
に設定して、スケジューリングプログラムポンプを停止します。 Continue
false
信頼できるソリューション
の使用方法:
<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>このソリューションは、非同期を実行するために非同期方法が必要であるという条件の下でうまく機能します。
以上がC#で非同期タスクメソッドを同期する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。