C# 调试Task.WhenAny和推送通知
我有以下代码段来处理Azure通知中心推送通知: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
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:让我这样说:您有一个泄漏资源的函数,您正在询问如何防止它泄漏资源。唯一可能的解决方案是修复或不使用它。我同情你,但你要求的是逻辑上的不可能。如果任务从未完成,接受的答案将泄漏资源。