2017-04-02 10 views
1

IのAzure通知ハブのプッシュ通知を処理するために、次のスニペット持っている:時々デバッグTask.WhenAnyとプッシュ通知

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

これは何を意味しますか?タイムアウトになった場合、通知のために500ミリ秒しか割当てられていないので、これを増やす必要があります。通知タスクだけで 'await'すれば、例外が発生しますか?もしそうなら、その詳細を投稿してください。 – JSteward

+0

なぜあなたはまだタスクを待っていませんか? task.Wait(); TaskResultタスクを調べます.TaskResult? –

+0

@JStewardときどき私は 'success = false'を得るでしょう。これは、500msで完了しなかったか、または例外がスローされたためです。私はこれらのうちのどれが起こっているのか知りたい。それが例外であれば、私は例外が何であるか知りたい。 500ms以上かかると失敗するが、失敗した理由を知りたい。これらのタイムアウトがなければ、プッシュ通知は文字通り永遠に続くことがあります。 – user666

答えて

1

あなたは基本的に3つの可能性があります。

  1. Task.WhenAny(task, Task.Delay(500)) == taskがfalseを。これは、タイムアウトしたタスクが
  2. Task.WhenAny(task, Task.Delay(500)) == taskであることを意味します。そして、次のいずれか
    • t1.Status == TaskStatus.RanToCompletion場合は、タスクが正常に
    • そうでない場合は、それがキャンセルまたは障害が発生していますいずれかを実行しました。それは> 500ミリ秒を取る場合、私はそれが失敗にしたいが、私はそれがその場合

      を失敗した理由です知りたい詳しく

を見つけることtask.IsFaultedtask.Exceptionをチェックあなたが知ることができるのは、通知がタイムアウトしたことだけです。まだ完了していないため、ログに例外はありません。あなたはそれが最終的に完了したときの状態を確認したい場合は、あなたが継続連鎖することができます

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

論理が正しい間、私は 'ContinueWith' /' IsFaulted'/'Exception'のこの使用法を許すことができません。代わりに 'await'を' if'ブロックの中の 'await task'だけで使うべきです。 –

+0

@StephenCleary私たちがawaitを使用すると、タイムアウトが発生した時点を最初に敗北させます。ここでのロジックは、「ok、タスクが時間通りに応答しないので、コール元に制御を戻すことはできませんでしたが、タスクが最終的に完了したときに何が起きたかを知るための連鎖を続けます」 –

1

を、私は、例外がスローされたいずれかの場合、またはタイムアウトがヒットされたかどうかを知りたいのです。

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

これは、タスクが成功し、あなたは(例外がスローされます)タスクが失敗を区別できるように、例外を伝播します:あなただけのような、完了したタスクを観察する必要が

success == true)、タスクのタイムアウトは(success == false)です。

+0

Stephenに感謝します。上記のコメント?私は500ミリ秒以上かかるリクエストを避けようとしています(それはばかげています)。何らかの理由でNotification Hubへのこれらの呼び出しが返されることはありません。私はこれに対処するために寛大なタイムアウトを実装しましたが、私は思っています - あなたは何をお勧めしますか? – user666

+0

@ user666:私はNotification Hubに関する経験はありませんが、あなたが[あなたのコールスタックをさらにブロックする]ではないと確信しているならば(https://blog.stephencleary.com/2012/07/dont-block-on -async-code.html)、Azureの技術サポートの質問になります。 –

+0

一般的なコーディングの観点から、私が返すことのできないものを待っている場合、上記の目標を達成するための最良の方法はありますか?私は将来の読者がここから答えを得ることから利益を得ることができるように感じています - 非同期の非常に端のようなケースのように思えます/ – user666