C#异步编程是怎么回事

news2024/11/23 10:06:24

首先以一个例子开始

image

我说明一下这个例子。
这是一个演示异步编程的例子。

  • 输入job [name],在一个同步的Main方法中,以一发即忘的方式调用异步方法StartJob()
  • 输入time,调用同步方法PrintCurrentTime()输出时间。
  • 输出都带上线程ID,便于观察。
    可以看到,主线程不会阻塞。主线程在同步方法中使用一发即忘的方式调用异步方法时,在异步方法中碰到阻塞时,主线程返回同步方法中继续执行。而异步方法在另一个线程中继续执行。
    程序如下
internal class Program
{
    static void Main(string[] args)
    {
        while (true)
        {
            Console.WriteLine($"(Thread ID: {Thread.CurrentThread.ManagedThreadId}) Enter 'time' to get current time or 'job [name]' to start a job:");
            string input = Console.ReadLine();

            if (input.StartsWith("time"))
            {
                // 输出当前时间
                PrintCurrentTime();
            }
            else if (input.StartsWith("job"))
            {
                // 启动一个异步任务,执行指定的工作
                string[] parts = input.Split(new char[] { ' ' }, 2);
                string jobName = parts.Length > 1 ? parts[1] : string.Empty;
                StartJob(jobName);
            }
            else
            {
                Console.WriteLine("Invalid input. Please try again.");
            }
        }
    }

    static void PrintCurrentTime()
    {
        Console.WriteLine($"(Thread ID: {Thread.CurrentThread.ManagedThreadId}) Current time: {DateTime.Now}");
    }

    static async void StartJob(string jobName)
    {
        // 获取主线程的线程 ID
        int mainThreadId = Thread.CurrentThread.ManagedThreadId;

        // 检查是否在主线程上
        bool onMainThread = Thread.CurrentThread.ManagedThreadId == mainThreadId;

        Console.WriteLine($"(Thread ID: {Thread.CurrentThread.ManagedThreadId}) Starting job '{jobName}'. This will take 10 seconds...");

        // 输出主线程上下文

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

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

相关文章

SmartEDA VS Multisim/Proteus:电子设计江湖,谁主沉浮?

在电子设计的江湖里,SmartEDA、Multisim和Proteus无疑是几大门派,各自拥有独特的武功秘籍和门派特色。今天,我们就来一场巅峰对决,看看这些电子设计软件究竟谁能笑傲江湖,成为电子设计界的霸主! 一、门派起…

【虚拟现实】一、AR与VR的基本原理

人不走空 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌赋:斯是陋室,惟吾德馨 增强现实(AR)和虚拟现实(VR)技术已经从科幻小说走入现实&#xf…

atomic特质的局限性

为什么在实际的 Objective-C 开发中, 几乎所有的属性都声明为 nonatomic ? 声明为 atomic 的属性我是真的没见过 在实际的 Objective-C 开发中,大多数属性通常声明为 nonatomic,主要原因包括性能考虑和常见的设计模式。具体原因如下: 性能问…

Leetcode刷题笔记8

162. 寻找峰值 162. 寻找峰值 - 力扣(LeetCode) 对于所有有效的 i 都有 nums[i] ! nums[i 1] 解法一:暴力解法 从第一个位置一直向后走,然后分情况即可1. 第二个元素就往下降,那么第一个元素就是峰顶 2. 一直遍历…

Linux -- 正则表达式基础

提示:制作不易,可以点个关注和收藏哦。 前言 虽然我们这一节的标题是正则表达式,但实际这一节实验只是介绍grep,sed,awk这三个命令,而正则表达式作为这三个命令的一种使用方式(命令输出中可以包…

【C++】函数模板和类模版

目录 前言 模板参数 类型模板参数 非类型模板参数 模板的特化 函数模板的特化 类模板的特化 全特化 偏特化 模板的分离编译 模板总结 前言 函数模板和类模板是C模板编程中的两个核心概念,它们允许程序员编写泛型代码,这些代码可以在多种数据…

嵌入式单片机中项目在线仿真工具分享

前段时间,无意间发现了一个不错的在线仿真工具(Wokwi),支持多种平台,支持市面上主流的开发板,比如:STM32、ESP32、Arduino、树莓派等。 还支持常见的传感器、显示器件(LCD、LED屏幕)等,还可以播放音乐、联网、逻辑分析仪等,关键还提供了很多实际项目的案例。 这款工…

对称加密系统解析

目录​​​​​​​ 1.概述 2. 对称密码类型 3. 对称加密优缺点 4. 对称加密算法 4.1 DES 4.2 3DES 4.3 AES ​​​​​​4.4 SM1 4.5 SM4 1.概述 对称加密,是指在加密和解密时使用同一秘钥的方式。秘钥的传送和保存的保护非常重要,务必不要让秘…

【React】json-server

1.安装到开发环境 npm install json-server -D2.在根目录下下,新建db.json文件 {"list": [{"rpid": 3,"user": {"uid": "13258165","avatar": "http://toutiao.itheima.net/resources/images/9…

显示子系统,显示子前后端,linuxfb,wayland

显示前端 显示前端通常指的是在图形系统中负责生成图形数据的部分或组件。它负责接收来自应用程序或图形引擎的图形数据,并将其转换成适合显示的格式,以便发送到显示后端进行处理和输出。 显示前端的功能通常包括以下几个方面: 图形数据生…

自定义类型:枚举(enum)+联合体(union)

枚举联合体 一.枚举1.枚举类型的声明2.枚举类型的优点3.枚举类型的使用 二.联合体1.联合体类型的声明2.联合体的特点3.相同成员的结构体和联合体对比4.联合体大小的计算5.联合体的练习(判断大小端)6.联合体节省空间例题 一.枚举 1.枚举类型的声明 枚举…

《软件定义安全》之四:什么是软件定义安全

第4章 什么是软件定义安全 1.软件定义安全的含义 1.1 软件定义安全的提出 虚拟化、云计算、软件定义架构的出现,对安全体系提出了新的挑战。如果要跟上网络演进的步伐和业务快速创新的速度,安全体系应该朝以下方向演变。 𝟭 安全机制软件…

springcloud gateway扩展支持多版本灰度

改造要求 需要在原有的调度策略中通过客户端header中的version进行1个服务多实例下进行二次分组,让指定的version在指定的版本实例下进行轮训调度。 需要改造的点 1.业务服务在发布到naocs中的元数据需要指定版本号 2.网关的调度策略中需要增加版本的区分 3.无…

LeetCode | 1.两数之和

这道题,很容易想到的是暴力解,直接一个双重循环,对于数组中的每一个数,都去遍历其他数字,看能不能找到数字等于target-nums[i]的数字,时间复杂度为 O ( n 2 ) O(n^2) O(n2) 但是通过其他题目,我…

【算法专题--链表】环形链表--高频面试题(图文详解,小白一看就会!!)

目录 一、前言 二、什么是环形链表? 🥝 环形链表的概念详解 🍇 环形链表的特点 🍍环形链表的延申问题 三、高频面试题 ✨环形链表 ✨环形链表II ✨环形链表的环长 四、总结 五、共勉 一、前言 环形链表,可以说是…

VSCode超过390万下载的请求插件

Thunder Client 是一款在 VSCode(Visual Studio Code)中非常受欢迎的 REST API 客户端插件,由Ranga Vadhineni开发,现在已经有超过390万的下载量。它允许开发者直接在编辑器内发送 HTTP 请求,查看响应。Thunder Client…

力扣hot100:739. 每日温度/54. 螺旋矩阵

文章目录 一、 739. 每日温度二、54. 螺旋矩阵1、模拟螺旋矩阵的路径2、按层模拟 一、 739. 每日温度 LeetCode:739. 每日温度 经典单调栈问题,求下一个更大的数。 使用单调递减栈,一个元素A出栈,当且仅当它第一次出现比它更大…

bitset用法

参考:https://blog.csdn.net/weixin_45697774/article/details/105563993 题目:https://leetcode.cn/problems/maximum-total-reward-using-operations-ii/description/ class Solution { public:int maxTotalReward(vector<int>& rewardValues) {bitset<10000…

46.django - 多语言配置

1.Django 多语言基础知识 多语言站点可以让不同语言的用户更好地使用和理解网站内容&#xff0c;提升用户体验和覆盖范围。为了实现多语言功能&#xff0c;我们将使用Django内置的国际化和本地化支持。我收集了一些知识点整理在这一部分&#xff0c;感兴趣的可以看看。直接跳过…

单臂路由的配置(思科、华为)

#交换设备 不同vlan属于不同广播域&#xff0c;不能互相通信&#xff0c;他们配置的是不同网段的IP地址&#xff0c;针对不同网段的IP地址进行通信&#xff0c;就需要用到路由技术 实现不同vlan之间的通信技术有两种 单臂路由三层交换 单臂路由 一、思科设备的单臂路由配…