调试Task.WhenAny和推送通知

时间:2017-04-02 15:43:43

标签: c# .net azure async-await azure-notificationhub

我有以下代码片段来处理Azure Notification Hub推送通知:

var alert = "{\"aps\":{\"alert\":\"" + message + "\"}}";

var task = AzurePushNotifications.Instance.Hub.SendAppleNativeNotificationAsync(alert, username);

if (await Task.WhenAny(task, Task.Delay(500)) == task)
{
     success = true;
}

偶尔,这会失败 - 我试图找出原因?

使用Task.WhenAny运行时获取某些诊断信息的最佳方式是什么?

我想知道是否抛出了异常,或者是否超时了。

2 个答案:

答案 0 :(得分:1)

你基本上有三种可能性:

  1. Task.WhenAny(task, Task.Delay(500)) == task是假的。这意味着任务超时
  2. Task.WhenAny(task, Task.Delay(500)) == task是真的。然后:
    • 如果t1.Status == TaskStatus.RanToCompletion,则任务成功运行
    • 否则,它会被取消或出现故障。查看task.IsFaultedtask.Exception以查找更多信息
  3.   

    如果需要> 500毫秒,我希望它失败,但我想知道它失败的原因

    在这种情况下,您唯一可以知道的是通知超时。记录没有例外,因为任务尚未完成。如果要在最终完成时检查状态,可以链接延续:

    task.ContinueWith(t => 
    {
        // Log t.Exception
    }, TaskContinuationOptions.OnlyOnFaulted);
    

答案 1 :(得分:1)

  

我想知道是否抛出了异常,或者是否超时了。

您只需要观察完成的任务,如下:

var task = ...;
if (await Task.WhenAny(task, Task.Delay(500)) == task)
{
  await task;
  success = true;
}

这将传播异常,允许您区分任务失败(将抛出异常),任务成功(success == true)和任务超时(success == false)。 / p>