我有以下代码,我尝试使用以下命令向远程端点发出请求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;
}
}
..偶尔我会得到ThreadAbortException
at the readResponseTask.Result
像这样:
System.Threading.ThreadAbortException:线程正在被中止。在
System.Threading.Monitor.ObjWait(布尔 exitContext,Int32
毫秒超时,对象 obj) at
System.Threading.ManualResetEventSlim.Wait(Int32毫秒超时,
CancellationToken(取消令牌)位于
System.Threading.Tasks.Task.SpinThenBlockingWait(Int32
毫秒超时、CancellationToken 取消令牌)
System.Threading.Tasks.Task.InternalWait(Int32毫秒超时,
CancellationToken(取消令牌)位于
System.Threading.Tasks.Task.Wait(Int32毫秒超时,
CancellationToken(取消令牌)
什么情况下会.Result
抛出这样的异常?我尝试在远程端点上模拟超时,但在.Wait()
代替.Result
。由于异常发生在.Wait()
,我假设结果已经从远程站点返回,但当它尝试访问结果时不知何故出了问题。
有什么线索吗?会不会和线程并发有关?
我会在 readResponseTask.Result 处得到 ThreadAbortException
不,你不知道。调用堆栈清楚地表明,实际上是 Wait() 调用产生了异常。请注意跟踪中频繁出现的“wait”一词。
很难看出你是如何感到困惑的。请记住,Task.Result 属性 getter 是很小 http://referencesource.microsoft.com/#mscorlib/system/threading/Tasks/Future.cs,826690b09f24e719当您运行程序的发布版本时,它将被内联。所以你永远不会can在堆栈跟踪中查看它。
也许您只需删除 Wait() 调用就可以领先。没有必要,Result 属性 getter 已经在必要时执行等待。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)