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,因此异步方法将不会等待
async
。因此,您需要在异步操作上显式使用Task.Wait
或Task.Result
,以确保控制台主方法不会终止,从而关闭整个过程。
我假设电话的线路是:
public static void Main(string[] args)
{
// Do some stuff
SendNotificationAsync();
}
你需要做两件事:
将
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); }
在调用堆栈顶部使用
Task.Wait
:public static void Main(string[] args) { // Do some stuff SendNotificationAsync().Wait(); }
这将适用于控制台应用程序。对于除默认ThreadPoolSynchronizationContext
之外具有自定义SynchronizationContext
的任何应用程序,都不建议使用此方法。在这些类型的应用程序中,始终使用await
。