02Cesium中常用的鼠标事件

文章目录

  • 02Cesium中常用的鼠标事件
    • 1、左键单击事件
    • 2、左键双击事件
    • 3、左键按下事件
    • 4、左键弹起事件
    • 5、中键按下事件
    • 6、中键弹起事件
    • 7、鼠标移动事件
    • 8、右键单击事件
    • 9、右键按下事件
    • 10、右键弹起事件
    • 11、鼠标滚轮事件
    • 具体在代码中的应用如下所示

02Cesium中常用的鼠标事件

Cesium中常用的鼠标事件有左键单击事件、左键双击事件、左键按下事件、左键弹起事件、中键按下事件、中键弹起事件、鼠标移动事件、右键单击事件、右键按下事件、右键弹起事件、鼠标滚轮事件。注意:是没有鼠标右键双击事件的说法的。这里只是涉及到鼠标对应事件的API用法,记录一下常用的鼠标事件,至于具体在场景中的应用,如屏幕坐标与经纬度的转换,鼠标点击获取经纬度等,看后续文章。

1、左键单击事件

var handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
handler.setInputAction(function(click){console.log('左键单击事件:',click.position);   
},Cesium.ScreenSpaceEventType.LEFT_CLICK);// 移除鼠标事件
handler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK);

2、左键双击事件

var handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
handler.setInputAction(function(click){console.log('左键双击事件:',click.position);   
},Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK);// 移除鼠标事件
handler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK);

3、左键按下事件

var handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
handler.setInputAction(function(click){console.log('左键按下事件:',click.position);   
},Cesium.ScreenSpaceEventType.LEFT_DOWN);// 移除鼠标事件
handler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_DOWN);

4、左键弹起事件

var handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
handler.setInputAction(function(click){console.log('左键弹起事件:',click.position);   
},Cesium.ScreenSpaceEventType.LEFT_UP);// 移除鼠标事件
handler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_UP);

5、中键按下事件

var handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
handler.setInputAction(function(click){console.log('中键按下事件:',click.position);   
},Cesium.ScreenSpaceEventType.MIDDLE_DOWN);// 移除鼠标事件
handler.removeInputAction(Cesium.ScreenSpaceEventType.MIDDLE_DOWN);

6、中键弹起事件

var handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
handler.setInputAction(function(click){console.log('中键弹起事件:',click.position);   
},Cesium.ScreenSpaceEventType.MIDDLE_UP);// 移除鼠标事件
handler.removeInputAction(Cesium.ScreenSpaceEventType.MIDDLE_UP);

7、鼠标移动事件

var handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
handler.setInputAction(function(movement){console.log('移动事件:',movement.endPosition);   
},Cesium.ScreenSpaceEventType.MOUSE_MOVE);// 移除鼠标事件
handler.removeInputAction(Cesium.ScreenSpaceEventType.MOUSE_MOVE);

8、右键单击事件

var handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
handler.setInputAction(function(click){console.log('右键单击事件',click.position);   
},Cesium.ScreenSpaceEventType.RIGHT_CLICK);// 移除鼠标事件
handler.removeInputAction(Cesium.ScreenSpaceEventType.RIGHT_CLICK);

9、右键按下事件

var handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
handler.setInputAction(function(click){console.log('右键按下事件',click.position);   
},Cesium.ScreenSpaceEventType.RIGHT_DOWN);// 移除鼠标事件
handler.removeInputAction(Cesium.ScreenSpaceEventType.RIGHT_DOWN);

10、右键弹起事件

var handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
handler.setInputAction(function(click){console.log('右键弹起事件',click.position);   
},Cesium.ScreenSpaceEventType.RIGHT_UP);// 移除鼠标事件
handler.removeInputAction(Cesium.ScreenSpaceEventType.RIGHT_UP);

11、鼠标滚轮事件

var handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
handler.setInputAction(function(wheelment){console.log('滚轮事件:',wheelment);   
},Cesium.ScreenSpaceEventType.WHEEL);// 移除鼠标事件
handler.removeInputAction(Cesium.ScreenSpaceEventType.WHEEL);

具体在代码中的应用如下所示

在对应vue中的代码如下所示,可以先看后面的截图,然后结合截图看代码相关的内容。对应的项目地址:https://gitee.com/the-world-keeps-blooming/my-vite-vue-cesium

<template><div style="width: 100%; height: 100%; position: relative;"><div id="cesiumContainer"></div><div class="cesium-viewer-toolbar"><el-row><div style="font-size: 16px;">Cesium中常用的鼠标事件</div></el-row><el-row style="margin-top: 16px;"><el-form label-width="auto" style="max-width: 600px"><el-form-item label="左键单击事件:"><el-button type="primary" @click="LEFT_CLICK">左键单击</el-button><el-button type="primary" @click="REMOVE_LEFT_CLICK">移除左键单击</el-button></el-form-item><el-form-item label="左键双击事件:"><el-button type="primary" @click="LEFT_DOUBLE_CLICK">左键双击</el-button><el-button type="primary" @click="REMOVE_LEFT_DOUBLE_CLICK">移除左键双击</el-button></el-form-item><el-form-item label="左键按下事件:"><el-button type="primary" @click="LEFT_DOWN">左键按下</el-button><el-button type="primary" @click="REMOVE_LEFT_DOWN">移除左键按下</el-button></el-form-item><el-form-item label="左键弹起事件:"><el-button type="primary" @click="LEFT_UP">左键弹起</el-button><el-button type="primary" @click="REMOVE_LEFT_UP">移除左键弹起</el-button></el-form-item><el-form-item label="中键按下事件:"><el-button type="primary" @click="MIDDLE_DOWN">中键按下</el-button><el-button type="primary" @click="REMOVE_MIDDLE_DOWN">移除中键按下</el-button></el-form-item><el-form-item label="中键弹起事件:"><el-button type="primary" @click="MIDDLE_UP">中键弹起</el-button><el-button type="primary" @click="REMOVE_MIDDLE_UP">移除中键弹起</el-button></el-form-item><el-form-item label="鼠标移动事件:"><el-button type="primary" @click="MOUSE_MOVE">鼠标移动</el-button><el-button type="primary" @click="REMOVE_MOUSE_MOVE">移除鼠标移动</el-button></el-form-item><el-form-item label="右键单击事件:"><el-button type="primary" @click="RIGHT_CLICK">右键单击</el-button><el-button type="primary" @click="REMOVE_RIGHT_CLICK">移除右键单击</el-button></el-form-item><el-form-item label="右键弹起事件:"><el-button type="primary" @click="RIGHT_UP">右键弹起</el-button><el-button type="primary" @click="REMOVE_RIGHT_UP">移除右键弹起</el-button></el-form-item><el-form-item label="滚轮事件:"><el-button type="primary" @click="WHEEL">滚轮事件</el-button><el-button type="primary" @click="REMOVE_WHEEL">移除滚轮事件</el-button></el-form-item><el-form-item label="多个事件结合:"><el-button type="primary" @click="MORE_EVENTS">多个事件</el-button><el-button type="primary" @click="REMOVE_MORE_EVENTS">移除多个事件</el-button></el-form-item></el-form></el-row><el-row><div style="font-size: 16px;">确保鼠标在地球上点击有效,这里以鼠标左键点击为例,其他以此类推</div></el-row><el-row style="margin-top: 16px;"><el-form label-width="auto" style="max-width: 600px"><el-form-item label="左键单击事件:"><el-button type="primary" @click="LEFT_CLICK_IN_EARTH">左键单击</el-button><el-button type="primary" @click="REMOVE_LEFT_CLICK_IN_EARTH">移除左键单击</el-button></el-form-item></el-form></el-row></div></div>
</template><script setup>
import { onMounted, onUnmounted } from 'vue';
import * as Cesium from 'cesium';let viewer = null;
// const viewer = reactive(null)// 开启鼠标监听事件
let handler = null;/*** 左键单击事件*/
const LEFT_CLICK = () => {handler.setInputAction(function (click) {// 这里的Click.position指的是屏幕坐标console.log('左键单击事件:', click.position);}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
}/*** 移除左键单击事件*/
const REMOVE_LEFT_CLICK = () => {handler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK)
}/*** 左键双击事件*/
const LEFT_DOUBLE_CLICK = () => {handler.setInputAction(function (click) {// 这里的Click.position指的是屏幕坐标console.log('左键双击事件:', click.position);}, Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK);
}/*** 移除左键双击事件*/
const REMOVE_LEFT_DOUBLE_CLICK = () => {handler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK)
}/*** 左键按下事件*/
const LEFT_DOWN = () => {handler.setInputAction(function (click) {// 这里的Click.position指的是屏幕坐标console.log('左键按下事件:', click.position);}, Cesium.ScreenSpaceEventType.LEFT_DOWN);
}/*** 移除左键按下事件*/
const REMOVE_LEFT_DOWN = () => {handler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_DOWN)
}/*** 左键弹起事件*/
const LEFT_UP = () => {handler.setInputAction(function (click) {// 这里的Click.position指的是屏幕坐标console.log('左键弹起事件:', click.position);}, Cesium.ScreenSpaceEventType.LEFT_UP);
}/*** 移除左键弹起事件*/
const REMOVE_LEFT_UP = () => {handler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_UP)
}/*** 中键按下事件*/
const MIDDLE_DOWN = () => {handler.setInputAction(function (click) {// 这里的Click.position指的是屏幕坐标console.log('中键按下事件:', click.position);}, Cesium.ScreenSpaceEventType.MIDDLE_DOWN);
}/*** 移除中键弹起事件*/
const REMOVE_MIDDLE_DOWN = () => {handler.removeInputAction(Cesium.ScreenSpaceEventType.MIDDLE_DOWN)
}/*** 中键弹起事件*/
const MIDDLE_UP = () => {handler.setInputAction(function (click) {// 这里的Click.position指的是屏幕坐标console.log('中键弹起事件:', click.position);}, Cesium.ScreenSpaceEventType.MIDDLE_UP);
}/*** 移除中键弹起事件*/
const REMOVE_MIDDLE_UP = () => {handler.removeInputAction(Cesium.ScreenSpaceEventType.MIDDLE_UP)
}/*** 鼠标移动事件*/
const MOUSE_MOVE = () => {handler.setInputAction(function (movement) {// 这里的movement.endPosition指的是屏幕坐标console.log('鼠标移动事件:', movement.endPosition);}, Cesium.ScreenSpaceEventType.MOUSE_MOVE);
}/*** 移除鼠标移动事件*/
const REMOVE_MOUSE_MOVE = () => {handler.removeInputAction(Cesium.ScreenSpaceEventType.MOUSE_MOVE)
}/*** 右键单击事件*/
const RIGHT_CLICK = () => {handler.setInputAction(function (click) {// 这里的Click.position指的是屏幕坐标console.log('右键单击事件:', click.position);}, Cesium.ScreenSpaceEventType.RIGHT_CLICK);
}/*** 移除右键单击事件*/
const REMOVE_RIGHT_CLICK = () => {handler.removeInputAction(Cesium.ScreenSpaceEventType.RIGHT_CLICK)
}/*** 右键弹起事件*/
const RIGHT_UP = () => {handler.setInputAction(function (click) {// 这里的Click.position指的是屏幕坐标console.log('右键弹起事件:', click.position);}, Cesium.ScreenSpaceEventType.RIGHT_UP);
}/*** 移除右键弹起事件*/
const REMOVE_RIGHT_UP = () => {handler.removeInputAction(Cesium.ScreenSpaceEventType.RIGHT_UP)
}/*** 滚轮事件*/
const WHEEL = () => {handler.setInputAction(function (movement) {console.log('滚轮事件:', movement.endPosition);}, Cesium.ScreenSpaceEventType.WHEEL);
}/*** 移除滚轮事件*/
const REMOVE_WHEEL = () => {handler.removeInputAction(Cesium.ScreenSpaceEventType.WHEEL)
}/*** 多个事件结合使用*/
const MORE_EVENTS = () => {// 为了防止其他事件影响,先移除所有事件handler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK)handler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK)handler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_DOWN)handler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_UP)handler.removeInputAction(Cesium.ScreenSpaceEventType.MIDDLE_DOWN)handler.removeInputAction(Cesium.ScreenSpaceEventType.MIDDLE_UP)handler.removeInputAction(Cesium.ScreenSpaceEventType.MOUSE_MOVE)handler.removeInputAction(Cesium.ScreenSpaceEventType.RIGHT_CLICK)handler.removeInputAction(Cesium.ScreenSpaceEventType.RIGHT_UP)handler.removeInputAction(Cesium.ScreenSpaceEventType.WHEEL)// 以下三个方法在绘制的时候通常都是需要结合一起使用的。// 鼠标左键击事件handler.setInputAction(function (click) {// 这里的Click.position指的是屏幕坐标console.log('左键单击事件:', click.position);}, Cesium.ScreenSpaceEventType.LEFT_CLICK);// 鼠标移动事件handler.setInputAction(function (movement) {// 这里的movement.endPosition指的是屏幕坐标console.log('鼠标移动事件:', movement.endPosition);}, Cesium.ScreenSpaceEventType.MOUSE_MOVE);// 鼠标右键事件handler.setInputAction(function (click) {// 这里的Click.position指的是屏幕坐标console.log('右键单击事件:', click.position);}, Cesium.ScreenSpaceEventType.RIGHT_CLICK);
}/*** 移除多个事件结合*/
const REMOVE_MORE_EVENTS = () => {// 移除:鼠标左键击事件、鼠标移动事件、鼠标右键事件handler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK)handler.removeInputAction(Cesium.ScreenSpaceEventType.MOUSE_MOVE)handler.removeInputAction(Cesium.ScreenSpaceEventType.RIGHT_CLICK)}/*** 确保鼠标在地球上点击有效,这里以鼠标左键点击为例,其他以此类推,左键单击事件*/
const LEFT_CLICK_IN_EARTH = () => {// 为了防止其他事件影响,先移除所有事件handler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK)handler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_DOUBLE_CLICK)handler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_DOWN)handler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_UP)handler.removeInputAction(Cesium.ScreenSpaceEventType.MIDDLE_DOWN)handler.removeInputAction(Cesium.ScreenSpaceEventType.MIDDLE_UP)handler.removeInputAction(Cesium.ScreenSpaceEventType.MOUSE_MOVE)handler.removeInputAction(Cesium.ScreenSpaceEventType.RIGHT_CLICK)handler.removeInputAction(Cesium.ScreenSpaceEventType.RIGHT_UP)handler.removeInputAction(Cesium.ScreenSpaceEventType.WHEEL)handler.setInputAction(function (click) {// 这里的Click.position指的是屏幕坐标// 保证鼠标在地球上var ray = viewer.camera.getPickRay(click.position)var position = viewer.scene.globe.pick(ray, viewer.scene)if (position) {console.log("点击了地球,鼠标在地球上,焦点坐标:", position)} else {console.log('左键单击事件,鼠标不在地球上:', click.position);}}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
}const REMOVE_LEFT_CLICK_IN_EARTH = () => {// 这里也可以移除对应的所有事件,但是如果没有绑定其他事件的话就没必要了移除了,其实移除其他的也不影响,还能保证不受到其他事件的影响handler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK)
}onMounted(() => {// 对应的Cesium的tokenlet token = '你的token'Cesium.Ion.defaultAccessToken = tokenviewer = new Cesium.Viewer('cesiumContainer', {// 搜索框geocoder: false,// home键homeButton: false,// 全屏按钮fullscreenButton: false,// 动画控件animation: false,// 场景模式选择器,就是控制二三维的那个sceneModePicker: false,// 时间轴timeline: false,// 导航帮助提示按钮navigationHelpButton: false,// 地图选择器baseLayerPicker: false,});handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
})onUnmounted(() => {// 这个要不要都可以if (handler) {handler.destroy();}})</script><style scoped>
#cesiumContainer {width: 100%;height: 100%;margin: 0;padding: 0;overflow: hidden;
}/* 隐藏底部 */
:deep(.cesium-viewer-bottom) {display: none !important;
}.cesium-viewer-toolbar {position: absolute;background-color: #FFFFFF;width: 400px;height: 800px;top: 16px;left: 16px;padding: 16px;
}
</style>

结果如下图所示,点击的时候,F12打开浏览器的控制台,看着点击就可以了。
在这里插入图片描述

代码中还有确保鼠标在地球上点击有效,从而实现拿到的点位可以保证在地球上,这里以鼠标左键点击为例,其他以此类推。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1550846.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

vue组合式api

一、ref&#xff08;基本类型数据&#xff0c;对象类型数据&#xff09; 1.作用&#xff1a;定义响应式变量 2.语法&#xff1a;let xxx ref(初始值) 3.返回值&#xff1a;一个RefImpl的实例对象&#xff0c;简称ref对象&#xff0c;ref对象的value属性是响应式的。 4.注意…

PCL 快速均匀下采样

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1 快速均匀下采样 2.1.2 可视化原始点云和下采样后的点云 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接&#xff1a; PCL点云算法与项目实战案例汇总&#…

【有啥问啥】多目标跟踪SORT算法原理详解

多目标跟踪SORT算法原理详解 引言 多目标跟踪&#xff08;Multiple Object Tracking, MOT&#xff09;是计算机视觉领域的一个重要研究方向&#xff0c;广泛应用于视频监控、自动驾驶、人机交互等多个领域。其核心任务是在视频序列中持续、准确地识别和定位多个目标。SORT&am…

数据网格:数据去中心化的特征

在现代的数据管理架构理念中&#xff0c;常常会谈及数据网格&#xff0c;将它用来解决大规模、复杂数据环境下的数据管理和利用问题。本文将探讨数据网格的概念以及数据去中心化和数据网格的紧密联系。 一数据网格 数据网格定义&#xff1a;数据网格将数据视为一种产品&#x…

tailwindcss快速入门(上篇)

tailwindcss 相关链接 演示地址 演示地址 源码地址 源码地址 什么是 Tailwind Tailwind CSS 是一种 实用优先的 CSS 框架&#xff0c;它通过一组预定义的、基于类名的样式帮助开发者快速构建现代化、响应式的用户界面。与传统的 CSS 框架&#xff08;如 Bootstrap&#xf…

只申请一块sizeofimage的内存能否实现PE文件的拉伸

不能,别试了,浪费时间. 从最后一个节复制,也会被覆盖 BOOL StrechFileBuffer(__in char* m_fileName, __inout char** LPImageBuffer) {FILE* file (fopen(m_fileName, "rb"));if (file NULL){printf("error :%d", GetLastError());return FALSE;}// 从文…

工作日志:nvm版本控制遇到的一系列问题。

1、安装vue3可使用的富文本编辑器。&#xff08;https://www.wangeditor.com/v5/for-frame.html#demo-1&#xff09; npm install wangeditor/editor-for-vuenext --save2、为同时拥有两个类的元素设置样式&#xff0c;组合选择器是通过在选择器中并列写入两个类名来实现的&am…

PL3328CD直插DIP7/24W反激式开关电源芯片

PL3328CD 是一系列高效率、高集成度、原边调节的 PWM功率开关&#xff0c;其主要应用于 AC/DC 反激式开关电源。PL3328C通过去除光耦以及次级控制电路&#xff0c;简化了充电器/适配器等传统的恒流/恒压的设计&#xff0c;从而实现高精度的电压和电流调节&#xff0c;调节波形如…

zy85_C#中文件夹操作,Path,以及Environment类

文章目录 1.文件夹的操作1.1Directory类的部分方法1.2程序代码 2.Path2.1Path类的部分字段和方法2.2程序代码 3.Environment3.1Environment类3.2SpecialFolder类3.3程序代码 1.文件夹的操作 1.1Directory类的部分方法 1.2程序代码 try {string path "D:\01";if (D…

leetcode45:跳跃游戏||

给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 < j < nums[i] i j < n 返回到达 nums[n - 1] 的最小…

低空经济时代:无人机飞行安全要点详解

随着低空经济的蓬勃发展&#xff0c;无人机&#xff08;UAV&#xff09;在农业、航拍、物流、应急救援等多个领域的应用日益广泛。然而&#xff0c;无人机的安全飞行不仅关乎任务的成功与否&#xff0c;更直接关系到地面人员、财产及空中交通的安全。本文将从飞行前检查、环境评…

plt.bar函数介绍及实战

目录 plt.bar() 函数实战 plt.bar() 函数 plt.bar() 函数是 Matplotlib 中用于创建柱状图的函数。它用于在图形中绘制一个或多个柱状图&#xff0c;通常用于展示类别型数据的数量或大小的比较。 基本语法&#xff1a; plt.bar(x, height, width0.8, bottomNone, aligncenter…

水波荡漾效果+渲染顺序+简单UI绘制

创建场景及布置 创建新场景Main,在Main场景中创建一个plane物体&#xff0c;命名为WaterWavePla,具体数值及层级面板排布如下&#xff1a; 编写脚本 创建一个文件夹&#xff0c;用于存放脚本&#xff0c;命名Scripts,创建一个子文件夹Effect,存放特效相关脚本&#xff0c;创建…

【Linux 22】生产者消费者模型

文章目录 &#x1f308; 一、生产者消费者模型⭐ 1. 生产者消费者模型的概念⭐ 2. 生产者消费者模型的特点⭐ 3. 生产者消费者模型的优点 &#x1f308; 二、基于阻塞队列的生产消费模型⭐ 1. 阻塞队列概念⭐ 2. 模拟实现基于阻塞队列的生产消费模型 &#x1f308; 三、POSIX 信…

ASP.NET Core 创建使用异步队列

示例图 在 ASP.NET Core 应用程序中&#xff0c;执行耗时任务而不阻塞线程的一种有效方法是使用异步队列。在本文中&#xff0c;我们将探讨如何使用 .NET Core 和 C# 创建队列结构以及如何使用此队列异步执行操作。 步骤 1&#xff1a;创建 EmailMessage 类 首先&#xff0c…

【零基础入门产品经理】学习准备篇 | 需要学一些什么呢?

前言&#xff1a; 零实习转行产品经理经验分享01-学习准备篇_哔哩哔哩_bilibili 该篇内容主要是对bilibili这个视频的观后笔记~谢谢美丽滴up主友情分享。 全文摘要&#xff1a;如何在0实习且没有任何产品相关经验下&#xff0c;如何上岸产品经理~ 目录 一、想清楚为什么…

AIGC教程:如何用Stable Diffusion+ControlNet做角色设计?

前言 对于生成型AI的画图能力&#xff0c;尤其是AI画美女的能力&#xff0c;相信同行们已经有了充分的了解。然而&#xff0c;对于游戏开发者而言&#xff0c;仅仅是漂亮的二维图片实际上很难直接用于角色设计&#xff0c;因为&#xff0c;除了设计风格之外&#xff0c;角色设…

C#知识|基于反射和接口实现抽象工厂设计模式

哈喽&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 01 应用场景 在项目的多数据库支持上、业务的多算法封装、以及各种变化的业务中&#xff1b; 02 抽象工厂组成 抽象工厂包括抽象产品&#xff08;即业务接口&#xff0c;可以通过抽象类或抽象接口设计&#xff09;…

mfc140u.dll缺失?快速解决方法全解析,解决mfc140u.dll错误

当你的电脑出现找不到mfc140u.dll的问题&#xff0c;不少用户在使用电脑时陷入了困扰。这个错误提示就像一道屏障&#xff0c;阻挡了用户正常使用某些软件。无论是办公软件、游戏还是专业的设计工具&#xff0c;一旦出现这个问题&#xff0c;都会导致软件无法正常运行。如果您也…

mips指令系统简介

**MIPS&#xff08;Microprocessor without Interlocked Piped Stages&#xff09;**&#xff1a;这是一种RISC&#xff08;精简指令集计算&#xff09;芯片架构&#xff0c;由John L. Hennessy设计&#xff0c;特点是没有内部互锁的流水级&#xff0c;简化了处理器设计。 对比…