调用Task.Result时出现ThreadAbortException

use*_*346 7 c# multithreading thread-safety asp.net-web-api

我有以下代码,我正在尝试使用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;
   }
 }
Run Code Online (Sandbox Code Playgroud)

..和偶尔我会得到ThreadAbortExceptionreadResponseTask.Result,像这样:

System.Threading.ThreadAbortException:线程正在中止.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)在System.Threading.Tasks.Task.InternalWait(Int32 millisecondsTimeout,CancellationToken cancellationToken)处于System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout,CancellationToken cancellationToken)

在什么情况下.Result抛出这样的例外?我已经尝试模拟远程端点上的超时但我得到了异常.Wait()而不是.Result.由于异常发生之后.Wait(),我假设结果已经从远程站点返回但是在尝试访问结果时出现了某些问题.

有线索吗?它可能与线程并发有关吗?

Han*_*ant 6

我会在readResponseTask.Result上得到ThreadAbortException

不,你没有.调用堆栈清楚地表明它实际上是产生异常的Wait()调用.请注意跟踪中经常出现"等待"一词.

很难看出你是如何困惑的.请记住,Task.Result属性getter 非常小,当您运行程序的Release版本时,它将被内联.所以你永远不能在堆栈跟踪中看到它.

也许只需删除Wait()调用就可以领先.没必要,Result属性getter已经在必要时执行等待.


Ogu*_*gul 4

在 Wait() 期间,线程从外部中止。没有人能确切地说出原因。

启用网络客户端跟踪可以帮助检测根本原因。