用户名
Email
论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
帖子
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
IT评测·应用市场-qidao123.com技术社区
»
论坛
›
数据库
›
SQL-Server
›
C#异步和多线程的理解
C#异步和多线程的理解
傲渊山岳
论坛元老
|
2024-11-11 06:17:43
|
显示全部楼层
|
阅读模式
楼主
主题
1788
|
帖子
1788
|
积分
5364
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
1. 异步编程(Asynchronous Programming)
异步编程是通过非阻塞方式实行使命,通常适用于
I/O 麋集型使命
,比方文件读写、网络哀求、数据库访问等。这类操作不必要占用大量 CPU 资源,而是等待外部资源(如网络或硬盘)响应。
在 C# 中,异步编程使用 async 和 await 关键字来实现。异步方法会返回 Task 或 Task<T>,调用 await 后,主线程可以继续实行其他代码,不会被阻塞。异步使命完成后,程序会回到 await 的位置继续实行。
异步代码示例
以下是一个使用异步编程的示例:
using System;
using System.Net.Http;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
Console.WriteLine("Starting download...");
string content = await DownloadContentAsync("https://example.com");
Console.WriteLine("Download completed!");
Console.WriteLine($"Content length: {content.Length}");
}
static async Task<string> DownloadContentAsync(string url)
{
using HttpClient client = new HttpClient();
// 异步地开始下载内容
string content = await client.GetStringAsync(url);
return content;
}
}
复制代码
在这个例子中,DownloadContentAsync 是一个异步方法。调用 await DownloadContentAsync(...) 后,Main 方法不会被阻塞,它会开释 CPU,等到下载完成后再继续实行。这种非阻塞模式适合 I/O 麋集型使命。
这里该怎么理解,为什么不会阻塞,举个实际业务的例子,就是微信付出的接口并不马上返回付出效果,这就是没有阻塞线程,线程继续做其他事情,付出效果通过回调接口关照;那么假如不是异步会是什么样的,那就是不停等待微信付出的接口响应,这个时候线程就被阻塞了。异步可以理解成回调,进一步说.Net程序向操作系统读取文件,访问网络,什么时候读到了文件,什么时候网络有了响应再回调给.Net程序,.Net程序再启用线程池的线程继续完成回调后的使命,这也是异步后线程id会改变的原因。
2. 多线程编程(Multithreading Programming)
多线程编程是通过在多个线程上并行实行使命,适用于
CPU 麋集型使命
,如复杂盘算、数据处置惩罚等。这类操作必要充实利用 CPU 的多焦点能力来同时处置惩罚多个使命。
在 C# 中,多线程编程可以通过 Thread、ThreadPool、Task 等类实现。与异步不同,多线程会创建多个线程来实行不同的使命,这样多个使命可以并发运行。
多线程代码示例
以下是一个使用多线程的示例:
using System;
using System.Threading;
using System.Threading.Tasks;
class Program
{
static void Main()
{
Console.WriteLine("Starting CPU-intensive tasks...");
// 启动两个并行任务
Task task1 = Task.Run(() => PerformCpuIntensiveTask("Task 1"));
Task task2 = Task.Run(() => PerformCpuIntensiveTask("Task 2"));
// 等待任务完成
Task.WaitAll(task1, task2);
Console.WriteLine("All tasks completed.");
}
static void PerformCpuIntensiveTask(string taskName)
{
Console.WriteLine($"{taskName} started.");
for (int i = 0; i < 1000000000; i++)
{
// 模拟计算任务
double x = Math.Sqrt(i);
}
Console.WriteLine($"{taskName} completed.");
}
}
复制代码
在这个例子中,Task.Run 会在 ThreadPool 中创建并启动新的线程来实行 PerformCpuIntensiveTask,这样 Task 1 和 Task 2 就可以并行实行,进步了 CPU 使用服从。
实在无论是时阻塞的耗时照旧复杂盘算的耗时,这两个都是耗时,但是这两个又有很大区别,阻塞的耗时可以通过回调,开释当火线程来解决阻塞的问题,但是复杂盘算的耗时核回调就没有关系了。举个具体点的例子,要盘算一个天文级别的数字,一个人要10天,但是你发现这些数子是可以拆开来分给不同的人盘算,末了把效果加起来就行了。这种环境下使用多线程处置惩罚盘算使命,然后把效果加起来,减少了耗时,同时也进步了cpu的使用率。
总结
异步
主要用于非阻塞 I/O 操作,让程序在等待 I/O 时开释资源,适合 I/O 麋集型使命。适用于串行使命,不提拔单次耗时,但是对整个程序来说可以提示吞吐量。
多线程
用于让多个使命并行实行,充实利用 CPU 焦点资源,适合 CPU 麋集型使命。之前的单次使命可以拆分给不同使命实行的话可以提拔耗时,通过消耗硬件资源实现并行或者并发提拔服从。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
傲渊山岳
论坛元老
这个人很懒什么都没写!
楼主热帖
2022你不容错过的软件测试项目实战(we ...
SQL Server创建表
【微服务专题之】.Net6下集成微服务网 ...
Swift之Codable自定义解析将任意数据类 ...
MySQL max() min() 函数取值错误
K8S 性能优化 - K8S APIServer 调优 ...
ThinkPHP5 远程命令执行漏洞
kubernetes top查看内存CPU使用情况 ...
变量的定义和使用
2022年春节后这波疫情对于国内SAP咨询 ...
标签云
AI
运维
CIO
存储
服务器
快速回复
返回顶部
返回列表