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

Posted

技术标签:

【中文标题】Azure 通知中心 .net api 无法异步工作【英文标题】:Azure Notifications hub .net api not working async 【发布时间】:2014-11-21 14:23:32 【问题描述】:

我已按照this 教程为 ios 应用程序创建推送通知中心。

当我运行代码时

private static async void SendNotificationAsync()

     NotificationHubClient hub = NotificationHubClient.CreateClientFromConnectionString(host, "sideview", false);
     var alert = "\"aps\":\"alert\":\"Hello\"";
     await hub.SendAppleNativeNotificationAsync(alert);

从控制台程序的 static 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在下面的回答中所说,Console Application的main方法不能被标记为async,所以不会等待async方法

【问题讨论】:

你需要展示你是如何调用这些方法的——在你的问题中包含代码。 我要赌一把,你是从一个不能等待这个方法的方法调用它,因为它是一个异步无效,所以没有办法等待方法完成。 【参考方案1】:

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

我假设电话是这样的:

public static void Main(string[] args)

    // Do some stuff
    SendNotificationAsync();

你需要做两件事:

    SendNotificationAsync 更改为async Task 而不是async void,这样您就可以在返回的任务上使用Wait。注意async void 仅用于异步事件处理程序的兼容性:

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

    在调用堆栈的顶部使用Task.Wait

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

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

【讨论】:

因此,如果我在 web api“生态系统”中使用异步方法,我应该对私有静态异步任务 SendNotificationAsync() NotificationHubClient hub = NotificationHubClient.CreateClientFromConnectionString(host, "sideview" , 错误的); var alert = "\"aps\":\"alert\":\"Hello\"";等待 hub.SendAppleNativeNotificationAsync(alert); ? 你为什么认为你有任何问题? 我想说我不应该有问题 你应该没问题。

以上是关于Azure 通知中心 .net api 无法异步工作的主要内容,如果未能解决你的问题,请参考以下文章

尝试使用 Azure 通知中心批量发送时出现 403 禁止

Azure 通知中心包是不是与 .NET Core 兼容?

Azure 通知中心:SendTemplateNotificationAsync 是不是适用于 .net Core

使用 Azure 通知中心 REST API 读取频道的所有注册

带有 PHP 的 Azure 通知中心 REST API

使用一段时间后无法连接 Azure 通知中心