我有以下代码,我尝试使用 HttpClient
向远程端点发出请求:
using (var client = new HttpClient())
{
client.BaseAddress = _serviceBaseAddress;
Task<HttpResponseMessage> readResponseTask = client.GetAsync(relativeUri);
readResponseTask.Wait();
using (var response = readResponseTask.Result)
{
if (response.StatusCode == HttpStatusCode.NotFound || !response.IsSuccessStatusCode)
{
return default(TResult);
}
Task<TResult> readContentTask = response.Content.ReadAsAsync<TResult>();
readContentTask.Wait();
TResult value = readContentTask.Result;
return value;
}
}
..有时我会在 readResponseTask.Result
处得到 ThreadAbortException
,如下所示:
System.Threading.ThreadAbortException: Thread was being aborted. at System.Threading.Monitor.ObjWait(Boolean exitContext, Int32 millisecondsTimeout, Object obj) at System.Threading.ManualResetEventSlim.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken) at System.Threading.Tasks.Task.SpinThenBlockingWait(Int32 millisecondsTimeout, CancellationToken cancellationToken) at System.Threading.Tasks.Task.InternalWait(Int32 millisecondsTimeout, CancellationToken cancellationToken) at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken)
什么情况下.Result
会抛出这样的异常?我曾尝试在远程端点上模拟超时,但我在 .Wait()
而不是 .Result
处遇到了异常。由于异常发生在 .Wait()
之后,我假设结果已经从远程站点返回,但是当它试图访问结果时不知何故出了点问题。
有什么线索吗?会不会和线程并发有关?
最佳答案
I would get ThreadAbortException at the readResponseTask.Result
不,你不知道。调用堆栈清楚地表明实际上是 Wait() 调用产生了异常。请注意“等待”一词在跟踪中的频繁出现。
很难看出您是如何感到困惑的。请记住,Task.Result 属性 getter 是 very small并且将在您运行程序的发布版本时内联。所以您永远无法在堆栈跟踪中看到它。
也许您只需删除 Wait() 调用即可领先。没有必要,如果需要,Result 属性 getter 已经执行了等待。
关于c# - 调用 Task.Result 时出现 ThreadAbortException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33687845/