c# - 调用 Task.Result 时出现 ThreadAbortException

标签 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;
   }
 }

..有时我会在 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/

相关文章:

c# - 如何在 C# 中更改 MS 图表标签字体大小?

c# - 如果输入命令,如何在保留旧文本的同时添加新文本?

c# - 当服务器关闭 keep-alive http 连接时检测或避免客户端 CommunicationException

.net - C# 如果我以优先级 = RealTime 运行进程,GC 会发生什么?

c - 仅跨 2 个线程进行 NULL 检查是线程安全的吗?

java - 证明以下代码不是线程安全的

java - `obj` 中的 `synchronized(obj) {...}` 参数的目的是什么?

java - 在 Xamarin 中创建 Android 服务并从 Java native 客户端应用程序调用其方法

c# - .NET锁定IO代码

java - 具有唯一 ID 的 ArrayBlockingQueue