簡體   English   中英

為什么任務<httpresponsemessage> .Result 如果 Task 拋出異常<httpresponsemessage> .IsCompleted 是真的嗎?</httpresponsemessage></httpresponsemessage>

[英]Why does Task<HttpResponseMessage>.Result throw an exception if Task<HttpResponseMessage>.IsCompleted is true?

這只發生在重負載下,所以我不能舉一個簡單的例子。 這是一個系統測試,所以我試圖避免等待,而是創建 2,000 個請求,然后輪詢響應何時完成。

有問題的代碼是:

Task<HttpResponseMessage> response = responseStatus.Item1;
if (!response.IsCompleted)
    continue;
HttpResponseMessage result = response.Result;

對 Result 的調用會引發以下內容:

System.AggregateException: One or more errors occurred.
StackTrace:       at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
   at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification)
   at System.Threading.Tasks.Task`1.get_Result()
   at SystemTests.V2.LoadTests.Test1000Requests() in C:\git\Jenova\restfulengine\SystemTests.V2\LoadTests.cs:line 121
INNER EXCEPTION:    System.Threading.Tasks.TaskCanceledException: A task was canceled.
StackTrace:    System.AggregateException: One or more errors occurred. ---> System.Threading.Tasks.TaskCanceledException: A task was canceled.
   --- End of inner exception stack trace ---
   at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
   at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification)
   at System.Threading.Tasks.Task`1.get_Result()
   at SystemTests.V2.LoadTests.Test1000Requests() in C:\git\Jenova\restfulengine\SystemTests.V2\LoadTests.cs:line 121
---> (Inner Exception #0) System.Threading.Tasks.TaskCanceledException: A task was canceled.<---

2020-04-26 13:36:06,370 [MSTestAdapter Thread] WARN SystemTests.V2.LoadTests - v2/reports/19ea788d-ceb8-4a81-a974-f597494609dd failed (will retry)System.AggregateException: One or more errors occurred. ---> System.Threading.Tasks.TaskCanceledException: A task was canceled.
   --- End of inner exception stack trace ---
   at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
   at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification)
   at System.Threading.Tasks.Task`1.get_Result()
   at SystemTests.V2.LoadTests.Test1000Requests() in C:\git\Jenova\restfulengine\SystemTests.V2\LoadTests.cs:line 121
---> (Inner Exception #0) System.Threading.Tasks.TaskCanceledException: A task was canceled.<---

Task.IsCompleted為“如果任務已完成,則為 true(即,任務處於三種最終狀態之一:RanToCompletion、Faulted 或 Canceled);否則為 false。”

因此,如果 HTTP 請求以無法創建可用HttpResponseMessage的方式失敗,您將無法訪問結果。 所以檢查 Task.Status 看看它是什么。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM