Heim >Backend-Entwicklung >C++ >Wie führe ich synchron eine asynchronisierte Aufgabenmethode in C#aus?
Task<T>
) definiert, um die Leistung und Antwortkapazität der Anwendung zu verbessern. In einigen Fällen müssen Sie jedoch möglicherweise asynchrone Methoden synchron ausführen, um zu debuggen oder zu testen. Task<T>
-Methode zu verwenden, mit der der aufrufende Thread blockiert wird, bis die Aufgabe abgeschlossen ist. In einigen Fällen führt dies jedoch zu Einfrier- und Leistungsproblemen der Benutzeroberfläche. Task.Wait()
-Methode. Obwohl es sich anhört, die Aufgabe gleichzeitig auszuführen, wird die Aufgabe nicht an die Kommission gebunden, aber tatsächlich eine Ausnahme. Task.RunSynchronously()
des Planungsprogramms auf DispatcherFrame
, um die Planungsprogrammpumpe zu stoppen. Continue
false
Eine zuverlässige Lösung
wie man verwendet:
<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>
Diese Lösung funktioniert gut unter der Bedingung, dass die asynchrone Methode asynchron ausführen muss.
Das obige ist der detaillierte Inhalt vonWie führe ich synchron eine asynchronisierte Aufgabenmethode in C#aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!