ホームページ >バックエンド開発 >C++ >C#で非同期タスクメソッドを同期する方法は?

C#で非同期タスクメソッドを同期する方法は?

DDD
DDDオリジナル
2025-02-01 07:16:08889ブラウズ

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

C#

メソッドで非同期を実行するにはどうすればよいですか? Task<T>

非同期プログラミングでは、通常、方法は、アプリケーションのパフォーマンスと応答能力を改善するための非同期タスク(

)として定義されます。ただし、場合によっては、デバッグまたはテストするために同期的に非同期方法を実行する必要がある場合があります。 Task<T>

非同期方法を実行するいくつかの方法

1つの方法は、タスクが完了するまで呼び出しスレッドをブロックする

メソッドを使用することです。ただし、場合によっては、これによりUIの凍結とパフォーマンスの問題が発生します。 Task.Wait()

もう1つの選択肢は、

メソッドを使用することです。タスクを同時に実行するように聞こえますが、タスクが委員会に拘束されない場合、実際に例外がスローされます。 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。