Azure通知中心.net api无法异步工作

本文关键字:异步 工作 api net 通知 Azure | 更新日期: 2023-09-27 18:24:43

我已经按照本教程为IOS应用程序创建了一个推送通知中心。

当我运行代码时

private static async void SendNotificationAsync()
{
     NotificationHubClient hub = NotificationHubClient.CreateClientFromConnectionString(host, "sideview", false);
     var alert = "{'"aps'":{'"alert'":'"Hello'"}}";
     await hub.SendAppleNativeNotificationAsync(alert);
}

从控制台程序的静态void Main(string[]args),什么都没有发生,控制台只是停止。

如果我使用

private static  void SendNotificationAsync()
{
     NotificationHubClient hub = NotificationHubClient.CreateClientFromConnectionString(host, "sideview", false);
     var alert = "{'"aps'":{'"alert'":'"Hello'"}}";
     hub.SendAppleNativeNotificationAsync(alert).Wait();
}

一切正常

更新

正如Yuval Itzchakov在下面的回答中所说,控制台应用程序的主要方法不能标记为async,因此异步方法将不会等待

Azure通知中心.net api无法异步工作

控制台应用程序的主方法不能标记为async。因此,您需要在异步操作上显式使用Task.WaitTask.Result,以确保控制台主方法不会终止,从而关闭整个过程。

我假设电话的线路是:

public static void Main(string[] args)
{
    // Do some stuff
    SendNotificationAsync();
}

你需要做两件事:

  1. SendNotificationAsync更改为async Task而不是async void,以便您可以对返回的Task执行Wait。注意async void仅用于异步事件处理程序的兼容性:

    private static async Task SendNotificationAsync()
    {
        NotificationHubClient hub = NotificationHubClient.CreateClientFromConnectionString(host, "sideview", false);
        var alert = "{'"aps'":{'"alert'":'"Hello'"}}";
        await hub.SendAppleNativeNotificationAsync(alert);
    }
    
  2. 在调用堆栈顶部使用Task.Wait

    public static void Main(string[] args)
    {
       // Do some stuff
       SendNotificationAsync().Wait();
    }
    

这将适用于控制台应用程序。对于除默认ThreadPoolSynchronizationContext之外具有自定义SynchronizationContext的任何应用程序,都不建议使用此方法。在这些类型的应用程序中,始终使用await