web-dev-qa-db-ja.com

非同期プログラミングとAzure関数

Azure関数の「パフォーマンスに関する考慮事項」の部分では、「非同期コードを使用し、呼び出しをブロックしないでください」の下にある Functions Best Practices では、asyncプログラミングがパフォーマンス向上のための推奨プラクティスです。しかし、それを使用する最良の方法は何ですか?たとえば、私のシナリオでは、次のService Busトリガーがあります。

public static void Run(
    [ServiceBusTrigger("topicname", "subname", AccessRights.Manage, 
    Connection = "TopicConnection")]string message, TraceWriter log)
{
    try {
        log.Info($"C# ServiceBus topic trigger function processed message: {message}");

        Task.Run(() => PushToDb(message, log));
    }
    catch(Exception ex)
    {
        log.Info($"Exception found {ex.Message}");
    }
}

上記のコードでは、PushToDbメソッドasyncを呼び出します。ただし、バックグラウンドで実行されるため、Functionランタイムはメッセージが正常に消費されたと見なして完了します。 PushToDbメソッドが例外をスローした場合はどうなりますか?ランタイムが完了していないことをランタイムが認識していることを確認するにはどうすればよいですか?

パフォーマンスのためにasyncをできるだけ使用することを検討しています。

24

関数を非同期にすることができます:

public static async Task Run(
    [ServiceBusTrigger("topicname", "subname", AccessRights.Manage, Connection = "TopicConnection")]string message,
    TraceWriter log)
{
    try
    {
        log.Info($"C# ServiceBus topic trigger function processed message: {message}");
        await PushToDb(message, log);
    }
    catch(Exception ex)
    {
        log.Info($"Exception found {ex.Message}");
    }
}

関数ランタイムを使用すると、関数を非同期にしてタスクを返すことができます。

この場合、呼び出しを待つだけで、通常どおりに例外を処理できます。

53
juunas