public JsonResult GenerateNotifications()
{
Task.Factory.StartNew(() => MyService.GenerateNotifications());
return Json(new { success = true }, JsonRequestBehavior.AllowGet);
}我的Service方法如下所示:
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个。
我应该以不同于控制器的方式生成通知吗?
发布于 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
我会将您的代码更改为:
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.WhenAll来await它们的完成。
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);
}https://stackoverflow.com/questions/26153135
复制相似问题