当前位置: 首页 > article >正文

踩雷,前端一直卡在获取token中

问题:一直卡在var token = SecureStorage.Default.GetAsync("auth_token").Result;

 public VideoService(){_httpClient = new HttpClient();var token = SecureStorage.Default.GetAsync("auth_token");}

这是一个典型的同步等待异步操作导致的死锁问题。在 VideoService 构造函数中使用 .Result 来同步等待异步操作是不推荐的做法,这可能会导致死锁。

这个问题的根本原因是:

  1. 在构造函数中使用 SecureStorage.Default.GetAsync("auth_token").Result 会同步阻塞当前线程,等待异步操作完成

  2. 而 SecureStorage 的异步操作可能需要在 UI 线程上完成某些操作

  3. 如果这个构造函数是在 UI 线程上调用的,就会造成死锁:UI 线程在等待异步操作完成,而异步操作又需要 UI 线程才能完成

解决方案是:

  1. 将同步的令牌获取操作改为真正的异步操作

  2. 在构造函数中只初始化 HttpClient 实例

  3. 添加一个私有的异步方法 InitializeHttpClient() 来处理令牌获取和设置 Authorization 头

  4. 使用 async void 模式(仅适用于这种初始化场景)来启动异步操作但不阻塞构造函数

这样修改后,构造函数会立即返回,而令牌的获取和设置会在后台异步完成,避免了死锁问题。

需要注意的是,这种方法也有一个小缺点:如果用户立即调用 VideoService 的方法,可能会在令牌设置完成之前就发出请求。不过在实际应用中,通常在登录后会有一定的时间间隔再调用其他 API,所以这个问题不太可能发生。

如果您希望确保令牌一定设置好再使用,可以考虑以下两种方案:

  1. 将 VideoService 的构造函数也改为异步,并使用工厂模式创建实例

  2. 在每个公共方法中检查并确保令牌已设置

public VideoService()
{_httpClient = new HttpClient();InitializeHttpClient();
}private async void InitializeHttpClient()
{try{// 从安全存储中获取认证令牌var token = await SecureStorage.Default.GetAsync("auth_token");if (!string.IsNullOrEmpty(token)){_httpClient.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", token);}}catch (Exception ex){System.Diagnostics.Debug.WriteLine($"初始化 HttpClient 时出错: {ex.Message}");}
}

相关文章:

踩雷,前端一直卡在获取token中

问题:一直卡在var token SecureStorage.Default.GetAsync("auth_token").Result; public VideoService(){_httpClient new HttpClient();var token SecureStorage.Default.GetAsync("auth_token");} 这是一个典型的同步等待异步操作导致的死…...

这是一个文章标题

# Markdown 全语法示例手册本文档将全面演示 Markdown 的语法元素,包含 **标题**、**列表**、**代码块**、**表格**、**数学公式** 等 18 种核心功能。所有示例均附带实际应用场景说明。---## 一、基础文本格式### 1.1 标题层级 markdown # H1 (使用 #) ## H2 (使用…...

xtrabackup备份

安装: https://downloads.percona.com/downloads/Percona-XtraBackup-8.0/Percona-XtraBackup-8.0.35-30/binary/tarball/percona-xtrabackup-8.0.35-30-Linux-x86_64.glibc2.17.tar.gz?_gl1*1ud2oby*_gcl_au*MTMyODM4NTk1NS4xNzM3MjUwNjQ2https://downloads.perc…...

(51单片机)串口通讯(串口通讯教程)(串口接收发送教程)

前言: 今天有两个项目,分别为: 串口接收: 串口发送: 如上图将文件放在Keli5 中即可,然后烧录在单片机中就行了 烧录软件用的是STC-ISP,不知道怎么安装的可以去看江科大的视频: 【51单片机入门…...

redis 延迟双删

Redis延迟双删是一种用于解决缓存与数据库数据一致性问题的策略,通常在高并发场景下使用。以下是其核心内容: 1. 问题背景 当更新数据库时,如果未及时删除或更新缓存,可能导致后续读请求仍从缓存中读取旧数据,造成数…...

大语言模型中的幻觉现象深度解析

一、幻觉的定义及出现的原因 1. 基本定义 ​​幻觉(Hallucination)​​ 指大语言模型在自然语言处理过程中产生的与客观事实或既定输入相悖的响应,主要表现为信息失准与逻辑矛盾。 2. 幻觉类型与机制 2.1 事实性幻觉 ​​定义​​:生成内容与可验证…...

App的欢迎页,以及启动黑屏的问题

1、在styles.xml文件中配置&#xff1a;<style name"WelcomePageStyle" parent"style/Theme.AppCompat.Light.NoActionBar"><item name"android:windowBackground">mipmap/icon_welcome_bg</item><item name"android:…...

各种颜色空间的相互转换方法(RGB,HSV,CMYK,灰度)

各个颜色空间原始值的取值范围&#xff1a; RGB&#xff1a;[0,255] H&#xff1a;[0,360]&#xff0c;S&#xff1a;[0,1]&#xff0c;V&#xff1a;[0,1] CMYK&#xff1a;[0,1] 灰度&#xff1a;[0,255] 以下给出各个颜色空间转换的伪代码。 RGB转HSV rR/255 gG/255 b…...

详解如何从零用 Python复现类似 GPT-4o 的多模态模型

&#x1f9e0; 向所有学习者致敬&#xff01; “学习不是装满一桶水&#xff0c;而是点燃一把火。” —— 叶芝 我的博客主页&#xff1a; https://lizheng.blog.csdn.net &#x1f310; 欢迎点击加入AI人工智能社区&#xff01; &#x1f680; 让我们一起努力&#xff0c;共创…...

大模型训练关键两步

大模型的核心原理是基于深度学习&#xff0c;通过多层神经网络进行数据建模和特征提取。目前大部分的大模型采用的是Transformer架构&#xff0c;它采用了自注意力机制&#xff0c;能够处理长距离依赖关系&#xff0c;从而更好地捕捉文本的语义和上下文信息。大模型还结合了预训…...

当算力遇上脑科学:破解意识上传的算力密码

目录 一、人脑复刻面临的三座大山 二、自然科学之外的三大麻烦 三、未来发展的三种可能结局 ​​没有人的文明还是文明吗? 最近,全球首例"数字永生"官司闹得沸沸扬扬——美国富豪家属指控科技公司造假,而马斯克却宣布脑机接口芯片升级到第9代。科学家们算了一…...

前端面试宝典---创建对象的配置

Object.create 对整个对象的多个属性值进行配置 创建对象 不可更改属性值 // 创建对象 不可更改属性值 let obj Object.create({}, {name: {value: lisi,writable: false,},age: {value: 20,writable: true,} })console.log(初始化obj, obj) obj.name wangwu console.log(…...

【设计模式】创建型 -- 单例模式 (c++实现)

文章目录 单例模式使用场景c实现静态局部变量饿汉式&#xff08;线程安全&#xff09;懒汉式&#xff08;线程安全&#xff09;懒汉式&#xff08;线程安全&#xff09; 智能指针懒汉式(线程安全)智能指针call_once懒汉式(线程安全)智能指针call_onceCRTP 单例模式 单例模式是…...

共享内存(与消息队列相似)

目录 共享内存概述 共享内存函数 &#xff08;1&#xff09;shmget函数 功能概述 函数原型 参数解释 返回值 示例 结果 &#xff08;2&#xff09;shmat函数 功能概述 函数原型 参数解释 返回值 &#xff08;3&#xff09;shmdt函数 功能概述 函数原型 参数解释…...

2025年常见渗透测试面试题- PHP考察(题目+回答)

网络安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 PHP考察 php的LFI&#xff0c;本地包含漏洞原理是什么&#xff1f;写一段带有漏洞的代码。手工的话如何发掘&am…...

【C++进阶】关联容器:multimap类型

目录 一、multimap 基础概念与底层实现 1.1 定义与核心特性 1.2 底层数据结构 1.3 类模板定义 1.4 与其他容器的对比 二、multimap 核心操作详解 2.1 定义与初始化 2.2 插入元素 2.3 查找元素 2.4 删除元素 2.5 遍历元素 三、性能分析与适用场景 3.1 时间复杂度分…...

远程管理命令:关机和重启

关机/重启 序号命令对应英文作用01shutdown 选项 时间shutdown关机 / 重新启动 一、shutdown shutdown 命令可以安全关闭 或者 重新启动系统。 选项含义-r重新启动 提示&#xff1a; 不指定选项和参数&#xff0c;默认表示 1 分钟之后 关闭电脑远程维护服务器时&#xff0…...

塑造现代互联网的力量:Berkeley在网络领域的影响与贡献

引言 “Berkeley” 这个名字在计算机网络和互联网领域中具有举足轻重的地位&#xff0c;许多关键的技术、协议和工具都与其紧密相关。它与 加利福尼亚大学伯克利分校&#xff08;UC Berkeley&#xff09; 密切相关&#xff0c;该校在计算机科学与网络研究中做出了许多开创性的…...

【MySQL】001.MySQL安装

文章目录 一. MySQL在Ubuntu 20.04 环境安装1.1 更新软件包列表1.2 安装MySQL服务器1.3 配置安全设置1.4 检查mysql server是否正在运行1.5 进行连接1.6 查询自带的数据库 二. 配置文件的修改三. MySQL连接TCP/IP时的登陆问题四. MySQL中的命令 一. MySQL在Ubuntu 20.04 环境安…...

vue 入门:组件事件

文章目录 vue介绍vue 入门简单示例自定义组件事件 vue介绍 vue2 官网 Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套用于构建用户界面的渐进式框架。Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层。 vue 入门 Vue.js 的核心是一个允许采用简洁的模板语…...

数据质量问题中,数据及时性怎么保证?如何有深度体系化回答!

数据治理&#xff0c;数据质量这快是中大厂&#xff0c;高阶大数据开发面试必备技能&#xff0c;企业基于大数据底座去做数仓&#xff0c;那么首先需要保障的就是数据质量。 数据质量的重要性在现代企业中变得越发突出。以下是数据质量的几个关键方面&#xff0c;说明其对企业…...

数据可视化 —— 折线图应用(大全)

一、导入需要的库 # Matplotlib 是 Python 最常用的绘图库&#xff0c;pyplot 提供了类似 MATLAB 的绘图接口 import matplotlib.pyplot as plt import numpy as np import pandas as pd 二、常用的库函数 plt.plot(x轴,y轴)&#xff1a;plot()是画折线图的函数。 plt.xlabe…...

什么是中性线、零线、地线,三相四线制如何入户用电

在变压器三相电侧&#xff0c;按照星形连接法&#xff0c;有一个中心点&#xff0c;这根线引出来的线接不接地&#xff1a;不接地就是中性线&#xff0c;接地就是零线 下面就是没有接地&#xff1a;中性线 接地了以后就可以叫做零线了 三相电在高压输电的时候是没有零线的&a…...

自启动应用程序配置之etc/xdg/autostart

在 Linux 系统中&#xff0c;/etc/xdg/autostart/ 目录用于存放系统级的自动启动项&#xff08;.desktop 文件&#xff09;。这些文件遵循 FreeDesktop.org 的规范&#xff0c;定义了应用程序在用户登录时自动启动的规则。 ​​系统级 vs 用户级自动启动​​ ​​系统级​​&a…...

在 Linux 系统(ubuntu/kylin)上安装 Docker

在 Linux 系统上安装 Docker 的步骤如下(以 Ubuntu/Debian 和 CentOS/RHEL 为例): 请用./check-config config检查内核是否支持,necessarily 必须全部enable。 以下是脚本自行复制运行: #!/usr/bin/env sh set -eEXITCODE=0# bits of this were adapted from lxc-checkco…...

【含文档+PPT+源码】基于Android家政服务系统的开发与实现

介绍视频&#xff1a; 课程简介&#xff1a; 本课程演示的是一款基于Android家政服务系统的开发与实现&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 2.…...

SpringBoot + Netty + Vue + WebSocket实现在线聊天

最近想学学WebSocket做一个实时通讯的练手项目 主要用到的技术栈是WebSocket Netty Vue Pinia MySQL SpringBoot&#xff0c;实现一个持久化数据&#xff0c;单一群聊&#xff0c;支持多用户的聊天界面 下面是实现的过程 后端 SpringBoot启动的时候会占用一个端口&#xff…...

配置mac mini M4 的一些软件

最近更换了 mac mini M4 &#xff0c;想要重新下载配置软件 &#xff0c;记录一下。 Homebrew是什么&#xff1f; homebrew是一款Mac OS平台下的软件包管理工具&#xff0c;拥有安装、卸载、更新、查看、搜索等功能。通过简单的指令可以实现包管理&#xff0c;而不用关心各种…...

Java——抽象方法抽象类 接口 详解及综合案例

1.抽象方法抽象类 介绍 抽象方法: 将共性的行为(方法)抽取到父类之后&#xff0c; 由于每一个子类执行的内容是不一样&#xff0c; 所以&#xff0c;在父类中不能确定具体的方法体。 该方法就可以定义为抽象方法。 抽象类: 如果一个类中存在抽象方法&#xff0c;那么该类就必须…...

【计网】一二章习题

1. (单选题, 3 分) 假设主机A和B之间的链路带宽为100Mbps&#xff0c;主机A的网卡速率为1Gbps&#xff0c;主机B的网卡速率为10Mbps&#xff0c;主机A给主机B发送数据的最高理论速率为&#xff08; &#xff09;。 A. 100Mbps B. 1Gbps C. 1Mbps D. 10Mbps 正确答案 D 发…...