これは、task
が時間内に(100ms以内に)完了できなかったが、後で完了できたときに発生します。あなたはTaskContinuationOptions.OnlyOnFaulted
であなたの継続を実行し、元のタスクが失敗しなかった場合、そのようなタスクは取り消されました。あなたawait
の結果がContinueWith
なので、あなたのタスクにフォルトがない場合、あなたの継続はキャンセルされ、例外があります。
一般にタイムアウトを処理するこのような方法はあまり意味がありません。タイムアウトに達しても、元のタスクが完了するまで待機して例外を記録するためです。私はあなたの継続の前にawait
を取り除かなければならないと思います。その後、タイムアウト時にコードは続行されますが、タスクが後で失敗すると記録されます。
あなたのコードには別の問題があります。Task.WhenAny
は決して投げません。したがって、この条件:task
に障害が発生する可能性があるため
await Task.WhenAny(task, Task.Delay(100)) == task
は、成功を意味するものではありません。 WhenAny
がタスクの完了を示していても、常にtask.Status
とtask.Exception
をチェックしてください。ちなみに、あなたの質問にリンクしているその答えはこれを言います。
更新:あなたはVSが待たない呼び出しに関する警告気に入らない場合 - あなたは、この特定の行のためにそれを無効にするか、次のように拡張メソッドを使用することができ、次のいずれか
static class TaskExtensions
{
public static void Forget(this Task task)
{
// do nothing
}
}
そして:
task.ContinueWith(s => {
Logger.Write(s.Exception);
}, TaskContinuationOptions.OnlyOnFaulted).Forget();
(この特定のケースでは)これを実行することに害はありませんが、VSは待たれていない潜在的に待ち受け可能なすべてのコールに対してこの警告を発行します。
出典
2017-04-05 20:19:35
Evk
私は完全には明らかではありませんよ。漏れやすいAPIを処理しようとしているので、例外を投げずに処理することをどうお勧めしますか? – SB2055
答えが更新されました。タスクの前に 'await'を削除してください.ContinueWith。 – Evk
その後、VSは私が非同期呼び出しを待っていないと文句を言います。 – SB2055