首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Windows Azure Service Bus通知集线器仅接收部分通知

Windows Azure Service Bus通知集线器仅接收部分通知
EN

Stack Overflow用户
提问于 2014-10-02 09:22:39
回答 1查看 516关注 0票数 0
代码语言:javascript
复制
    public JsonResult GenerateNotifications()
    {
        Task.Factory.StartNew(() => MyService.GenerateNotifications());
        return Json(new { success = true }, JsonRequestBehavior.AllowGet);
    }

我的Service方法如下所示:

代码语言:javascript
复制
    public async void GenerateNotifications()
    {
        NotificationHubClient hub = NotificationHubClient.CreateClientFromConnectionString(AppHelper.AzureNotificationHubConnectionString, "myhub");

        for (int i = 0; i < 10; i++)
        {
            var notification = new
            {
                aps = new
                {
                    alert = string.Format("Awesome Notification {0}", i),
                    sound = "default"
                }
            };

            string notificationJSON = JsonConvert.SerializeObject(notification);
            NotificationOutcome result = await hub.SendAppleNativeNotificationAsync(notificationJSON, "mytag");
        }
    }

我遇到的问题是,在我应该收到的10个通知中,我通常只收到5-6个。

我应该以不同于控制器的方式生成通知吗?

EN

回答 1

Stack Overflow用户

发布于 2014-10-02 10:05:54

因为你的GenerateNotification方法是async void,你可能会得到一些被吞噬的异常。您应该返回一个Task,并确保对该方法执行await操作,以便观察并重新抛出异常。

一旦你有了它,你可以直接使用await MyService.GenerateNotifications(),而不是使用Task.Factory.StartNew(() => MyService.GenerateNotifications())。有关使用async/await的一些注意事项,请参阅Best Practices in Asynchronous Programming

我会将您的代码更改为:

代码语言:javascript
复制
    public async Task<JsonResult> GenerateNotifications()
    {
        await MyService.GenerateNotifications();
        return Json(new { success = true }, JsonRequestBehavior.AllowGet);
    }

    public async Task GenerateNotifications()
    {
        NotificationHubClient hub = NotificationHubClient.CreateClientFromConnectionString(AppHelper.AzureNotificationHubConnectionString, "myhub");

        for (int i = 0; i < 10; i++)
        {
            var notification = new
            {
                aps = new
                {
                    alert = string.Format("Awesome Notification {0}", i),
                    sound = "default"
                }
            };

            string notificationJSON = JsonConvert.SerializeObject(notification);
            NotificationOutcome result = await hub.SendAppleNativeNotificationAsync(notificationJSON, "mytag");
        }
    }

目前,您还在连续发送通知。您可以并行发送它们,方法是将结果任务添加到列表中,然后使用await Task.WhenAllawait它们的完成。

代码语言:javascript
复制
public async Task GenerateNotifications()
{
    NotificationHubClient hub = NotificationHubClient.CreateClientFromConnectionString(AppHelper.AzureNotificationHubConnectionString, "myhub");

    List<Task<NotificationOutcome>> notificaitonTasks = new List<Task<NotificationOutcome>>();

    for (int i = 0; i < 10; i++)
    {
        var notification = new
        {
            aps = new
            {
                alert = string.Format("Awesome Notification {0}", i),
                sound = "default"
            }
        };

        string notificationJSON = JsonConvert.SerializeObject(notification);
        notificaitonTasks.Add(hub.SendAppleNativeNotificationAsync(notificationJSON, "mytag"));
    }

    await Task.WhenAll(notificaitonTasks);
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26153135

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档