C# 调试Task.WhenAny和推送通知

C# 调试Task.WhenAny和推送通知,c#,.net,azure,async-await,azure-notificationhub,C#,.net,Azure,Async Await,Azure Notificationhub,我有以下代码段来处理Azure通知中心推送通知: var alert = "{\"aps\":{\"alert\":\"" + message + "\"}}"; var task = AzurePushNotifications.Instance.Hub.SendAppleNativeNotificationAsync(alert, username); if (await Task.WhenAny(task, Task.Delay(500)) == task) { succes

我有以下代码段来处理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(Task,Task.Delay(500))==Task
    为false。这意味着任务超时
  • Task.WhenAny(Task,Task.Delay(500))==Task
    为真。然后:
    • 如果
      t1.Status==TaskStatus.RanToCompletion
      ,则任务成功运行
    • 否则,它将被取消或出现故障。检查
      task.IsFaulted
      task.Exception
      以查找更多信息
  • 如果需要>500毫秒,我希望它失败,但我想知道这就是它失败的原因

    在这种情况下,您只能知道通知超时。由于任务尚未完成,日志中没有异常。如果要在最终完成时检查状态,可以链接继续:

    task.ContinueWith(t => 
    {
        // Log t.Exception
    }, TaskContinuationOptions.OnlyOnFaulted);
    
    我想知道是否抛出了异常,或者是否达到了超时

    您只需观察已完成的任务,如下所示:

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

    这将传播异常,允许您区分任务失败(将引发异常)、任务成功(
    success==true
    )和任务超时(
    success==false
    )。

    这是什么意思?如果超时,您只为通知分配了500毫秒,这可能需要增加。如果您
    等待
    通知任务本身是否会引发异常?如果是这样,请发布这些细节。你为什么不等待任务;task.Wait();然后看看TaskResult task.TaskResult?@JSteward有时我会得到
    success=false
    。这要么是因为它没有在500毫秒内完成,要么是因为引发了异常。我想知道其中哪一个正在发生。如果是例外,我想知道例外是什么。如果需要>500毫秒,我希望它失败,但我想知道这就是它失败的原因。如果没有这些超时,推送通知有时会持续很长时间。@MichaelPuckettII如上所述。虽然逻辑正确,但我不能容忍使用
    ContinueWith
    /
    IsFaulted
    /
    Exception
    。您应该只使用
    await
    来代替:
    await task
    if
    块中。@StephenCleary如果我们使用await,那么它首先就没有超时。这里的逻辑是说“好吧,任务没有及时响应,所以我将控制权交还给了调用方,但我链接了一个继续,以了解任务最终完成时发生了什么”谢谢你,斯蒂芬-你看到凯文的评论了吗?我正试图避免超过500毫秒的请求(即使这是荒谬的),由于某些原因,这些对通知中心的调用永远不会返回。我已经实施了一个慷慨的超时来解决这个问题,但我想知道-你有什么建议?@user666:我没有使用通知中心的经验,但如果你确定没有,那将是一个Azure技术支持问题。我从一般的编码角度问了更多问题-如果我
    等待
    一些永远不会回来的东西,实现上述目标的最佳方式是什么,并在接受的答案中给出评论?我觉得未来的读者可能会从你这里得到的答案中受益——这似乎不是一个很好的异步案例/await@user666当前位置然后我会让他们修复它,或者写一个替换。不能工作的代码不能被重用。在这种特殊情况下,没有适当的方法来处理一项永无止境的任务。框架中没有任何内容。你自己无能为力。除非您同意资源泄漏,否则在这种情况下,请使用我回答中的代码。@user666:让我这样说:您有一个泄漏资源的函数,您正在询问如何防止它泄漏资源。唯一可能的解决方案是修复或不使用它。我同情你,但你要求的是逻辑上的不可能。如果任务从未完成,接受的答案将泄漏资源。