Heim > Backend-Entwicklung > C++ > Wie führe ich synchron eine asynchronisierte Aufgabenmethode in C#aus?

Wie führe ich synchron eine asynchronisierte Aufgabenmethode in C#aus?

DDD
Freigeben: 2025-02-01 07:16:08
Original
949 Leute haben es durchsucht

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

Wie laufe ich in der C#

-Methode asynchron? Task<T>

In der asynchronen Programmierung werden Methoden normalerweise als asynchrone Aufgaben (

) 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>

verschiedene Methoden zum Ausführen asynchroner Methoden

Eine Methode besteht darin, die

-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()

Eine andere Wahl ist die Verwendung der

-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()

Schließlich können Sie eine Lösung mit Planungsprogrammrahmen verwenden. Erstellen Sie ein neues , starten Sie es und warten Sie auf Aufgaben in Lambda -Ausdrücken. Setzen Sie nach Abschluss der Aufgabe das Attribut

des Planungsprogramms auf DispatcherFrame, um die Planungsprogrammpumpe zu stoppen. Continue false Eine zuverlässige Lösung

Eine stärkere Lösung besteht darin, den synchronen Kontext zu verwenden, und der Kontext pumpt die Nachricht, bis die Aufgabe abgeschlossen ist. Dies ist eine Klasse, die diese Lösung implementiert:

wie man verwendet:
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
    {
        // ... 为简洁起见省略了实现细节
    }
}
Nach dem Login kopieren

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!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage