调试 Task.WhenAny 和推送通知

Debugging Task.WhenAny and Push Notifications

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

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 时,获取一些诊断信息的最佳方法是什么?

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

你基本上有三种可能:

  1. Task.WhenAny(task, Task.Delay(500)) == task 为假。表示任务超时
  2. Task.WhenAny(task, Task.Delay(500)) == task 是真的。然后:
    • 如果t1.Status == TaskStatus.RanToCompletion,则任务运行成功
    • 否则,它要么被取消,要么出错。检查 task.IsFaultedtask.Exception 以查找更多信息

If it takes > 500ms, I want it to fail, but I want to know that's why it failed

那样的话,你唯一能知道的就是通知超时了。由于任务尚未完成,因此不会记录异常。如果你想在它最终完成时检查状态,你可以链接一个延续:

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

I'd like to know if either an exception was thrown, or if the timeout has been hit.

您只需观察完成的任务即可,如:

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

这将传播异常,让您区分任务失败(将抛出异常)、任务成功(success == true)和任务超时(success == false) .