学习笔记 --C#基础其他知识点(持续更新)

news/2024/12/27 13:22:33/

C#中的同步和异步《一》
以下理解借鉴博客:借鉴博客地址1

异步编程(Asynchronous)

允许任务在后台执行,而不会阻塞调用线程。C#使用async和await关键字

async Task AsynchronousMethod()
{// 等待异步操作完成await Task.Delay(1000); // 模拟耗时操作Console.WriteLine("AsynchronousMethod 完成");
}

串行:

任务按照顺序一个接一个地执行,这在单线程程序中是自然的

// 同步串行
void Task1()
{Console.WriteLine("Task 1 is running");
}void Task2()
{Console.WriteLine("Task 2 is running");
}Task1();
Task2();// 异步串行
async Task Task1Async()
{Console.WriteLine("Task 1 is running");await Task.Delay(1000); // 模拟异步操作
}async Task Task2Async()
{Console.WriteLine("Task 2 is running");await Task.Delay(1000); // 模拟异步操作
}async Task MainAsync()
{await Task1Async();await Task2Async();
}MainAsync().GetAwaiter().GetResult(); // 运行异步方法

并行:(Parallel)

允许多个任务同时执行,通常利用多核处理器的能力。在C#中,Parallel.For、Parallel.ForEach和Parallel.Invoke等API用于并行执行。

using System.Threading.Tasks;void Task1()
{Console.WriteLine("Task 1 is running");
}void Task2()
{Console.WriteLine("Task 2 is running");
}Parallel.Invoke(() => Task1(), () => Task2());
Parallel.For(0, 10, i =>
{Console.WriteLine($"并行任务 {i} 开始");Thread.Sleep(100); // 模拟耗时操作Console.WriteLine($"并行任务 {i} 完成");
});

并发(Concurrency):

并发是并行和串行在更广泛意义上的结合。它指的是多个任务同时或几乎同时执行,但不一定在物理上并行


using System.Threading;void Task1()
{Console.WriteLine("Task 1 is running");
}void Task2()
{Console.WriteLine("Task 2 is running");
}Thread t1 = new Thread(new ThreadStart(Task1));
Thread t2 = new Thread(new ThreadStart(Task2));t1.Start();
t2.Start();t1.Join();
t2.Join();

死锁(Deadlock)

当两个或多个线程相互等待对方释放资源时,就会发生死锁

避免死锁的策略:1.确保所有线程以相同的顺序获取资源。2.使用锁超时机制。3.避免嵌套锁。4.使用更高级的并发控制机制,如信号量、事件或Concurrent集合。

以下理解借鉴博客:借鉴博客2

通过某种机制,让程序在等着IO的过程中,继续做点别的事,等IO的过程完成了,再回来处理IO的内容 --异步编程模型

C#中,异步编程,一个核心是指Task和Task对象,而两个关键字,就是async和await。
在遇到await关键字之后,系统做了以下工作:
异步方法将被挂起
将控制权返回给调用者
使用线程池中的线程(而非额外创建新的线程)来计算await表达式的结果,所以await不会造成程序的阻塞
完成对await表达式的计算之后,若await表达式后面还有代码则由执行await表达式的线程(不是调用方所在的线程)继续执行这些代码

定义一个异步方法应满足以下几点:
使用async关键字来修饰方法
在异步方法中使用await关键字(不使用编译器会给出警告但不报错),否则异步方法会以同步方式执行
尽量不使用void作为返回类型,若希望异步方法返回void类型,请使用Task
异步方法名称以Async结尾
异步方法中不能声明使用ref或out关键字修饰的变量

模式:

//定义
async Task function()
{/* your code here */
}
//调用
await function();

问题点:async和await的配对
在异步编程的规范中,async修饰的方法,仅仅表示这个方法在内部有可能采用异步的方式执行,CPU在执行这个方法时,会放到一个新的线程中执行。

那这个方法,最终是否采用异步执行,不决定于是否用await方式调用这个方法,而决定于这个方法内部,是否有await方式的调用。

await是什么意思?


http://www.ppmy.cn/news/1558533.html

相关文章

【超详细实操内容】django的身份验证系统之用户登录与退出

目录 1、用户登录:login()函数 (1)补充视图函数 (2)修改 success.html文件 (3)浏览器访问: 2、用户退出:logout()函数 (1)定义视图函数,实现退出的业务逻辑 (2)定义路由绑定视图函数 (3)在success.html页面增加一个退出的按钮 3、源码 通过请求对象r…

Spring Boot项目开发常见问题及解决方案(下)

安全相关问题 问题 51:没有配置安全认证,项目存在安全风险 如果项目直接对外暴露接口,没有任何安全认证机制,很容易被非法访问,造成数据泄露等安全问题。 解决方案: 引入 spring-boot-starter-security 依…

Trivy Operator命令使用说明

你已成功安装了 Trivy Operator,以下是命令的使用说明: 1. 查看 VulnerabilityReports VulnerabilityReports 是 Trivy Operator 生成的漏洞扫描报告,用于检查容器镜像中的漏洞。 kubectl get vulnerabilityreports --all-namespaces -o wi…

FlaskAPI-交互式文档与includ_router

1 FastAPI 交互式 API 文档 FastAPI 提供了内置的交互式 API 文档,使开发者能够轻松了解和测试 API 的各个端点。这个文档是自动生成的,基于 OpenAPI 规范,支持 Swagger UI 和 ReDoc 两种交互式界面。通过 FastAPI 的交互式 API 文档&#x…

使用C#生成一张1G大小的空白图片

如果你需要一个大文件,可以使用以下代码去生成,一次生成1G大小,多调用几次便可以生成几G的文件 // 设置图片的尺寸,使其大约为1GB int width 1024; // 宽度 int height 1024; // 高度 usi…

【商城源码的开发环境】

商城源码的开发环境要求主要包括技术选型、硬件配置、软件配置以及安全性和性能优化。以下是一些商城源码开发环境的要求: 技术选型 编程语言:选择合适的编程语言,如PHP、Java、Python等,这取决于项目需求和团队的技术栈。 数据…

nginx代理动态域名

server { listen 8080; server_name localhost; # 设置 DNS 解析器及解析超时时间 resolver 202.102.134.68 114.114.114.114 valid5s ipv6off; resolver_timeout 3s; # 定义变量,动态解析域名 set $skyneturl "dev.abc.com"; locati…

AppAgent源码 (OpenAIModel 类)

1. config.yaml 文件准备 模型用的是字节跳动的,链接:https://www.volcengine.com/ MODEL: "OpenAI" # The type of multi-modal LLM you would like to use to power the AppAgent, must be either OpenAI or QwenOPENAI_API_BASE: "…