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

C#关于多线程的线程问题

using System.Text;
​
namespace 平时练习8._19day06
{internal class Program{static async Task Main(string[] args){Console.WriteLine(Thread.CurrentThread.ManagedThreadId );StringBuilder sb = new StringBuilder();for (int i = 0; i < 10000; i++){sb.Append("xxxxxxxxxxxxxxxxxxxxxxxxxxxxx");}await File.AppendAllTextAsync(@"D:\a.txt", sb.ToString());Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
​}}
}

第一次结果为

第二次结果为

为什么两次线程的结果不一样

原因如下:

在这段代码中,你可能会观察到线程ID在 await 之前和之后不同,原因如下:

  1. 初始打印Console.WriteLine(Thread.CurrentThread.ManagedThreadId);Main 方法的开始处打印了主线程的ID。对于控制台应用程序,主线程通常是线程ID为1的线程。

  2. 异步操作:当执行到 await File.AppendAllTextAsync(@"D:\a.txt", sb.ToString()); 这行代码时,由于 await 的使用,当前方法是异步的。这意味着当 AppendAllTextAsync 这个异步I/O操作开始执行时,当前线程(主线程)会将控制权交还给调用者(在这个例子中是程序的入口点),并等待异步操作完成。

  3. 线程池线程AppendAllTextAsync 是一个异步文件I/O操作,通常由系统线程池中的一个线程来处理。一旦这个操作开始执行,它可能会在与初始调用不同的线程上运行。

  4. 继续执行:当异步操作完成,并且控制权返回到 await 之后的代码时,可能会在不同的线程上继续执行(尽管在某些情况下,比如单线程的同步上下文,它可能仍然在原始线程上继续执行)。这就是为什么第二次打印 Thread.CurrentThread.ManagedThreadId 可能会得到一个不同的线程ID。

  5. UI应用程序中的不同行为:如果你的程序是一个UI应用程序(如WPF或Windows Forms),那么UI相关的操作必须在UI线程上执行。在这种情况下,即使使用了 await,之后的代码也可能仍然在UI线程上继续执行,因此线程ID可能保持不变。

注意:异步方法的代码并不会自动在行动线程中执行,除非把代码方法新的线程中


namespace 平时练习8._19day07
{internal class Program{static async Task Main(string[] args){Console.WriteLine("之前:" + Thread.CurrentThread.ManagedThreadId);double r= await CalcAsync(5000);Console.WriteLine($"r={r}");Console.WriteLine("之前:" + Thread.CurrentThread.ManagedThreadId);    }private static async Task<double> CalcAsync(int v){Console.WriteLine("CalcAsync," + Thread.CurrentThread.ManagedThreadId);double result = 0;Random rand = new Random();for (int i = 0; i < v * v; i++){result += rand.NextDouble();}return result;}}
}


namespace 平时练习8._19day07
{internal class Program{static async Task Main(string[] args){Console.WriteLine("之前:" + Thread.CurrentThread.ManagedThreadId);double r= await CalcAsync(5000);Console.WriteLine($"r={r}");Console.WriteLine("之后:" + Thread.CurrentThread.ManagedThreadId);    }private static async Task<double> CalcAsync(int v){return await Task.Run(() =>{Console.WriteLine("CalcAsync," + Thread.CurrentThread.ManagedThreadId);double result = 0;Random rand = new Random();for (int i = 0; i < v * v; i++){result += rand.NextDouble();}return result;});}}
}

 

async方法的缺点

1.异步方法会生成一个类,运行效率 没有普通方法高

2.可能会占用非常多的线程

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Vue:从入门到放弃
  • 智慧水务项目(七)vscode 远程连接ubuntu 20.04 服务器,调试pyscada,踩坑多多
  • 回归预测|基于鲸鱼优化支持向量机结合Adaboost集成的数据回归预测Matlab程序 多特征输入单输出 效果非常不错!WOA-SVM-Adaboost
  • 探索AAA系统:网络安全与访问控制的核心机制
  • 中英双语介绍金融经济中的鹰派 (Hawkish)和鸽派 (Dovish)
  • 借助Aapose.Cells 使用 C# 在 Excel 中读取、添加和编辑线程注释
  • 从零开始学数据结构系列之第四章《什么是关键路径》
  • windows hook之进程防杀(任务管理器)
  • Python爬虫技术与K-means算法的计算机类招聘信息获取与数据分析
  • 小米便签——ui包详细解读
  • 基于Springboot网上蛋糕售卖店管理系统的设计与实现--论文pf
  • 配置oss cdn加速静态资源访问 阿里云
  • 【多线程开发 6】spring中的注解/API的线程问题
  • 基于Python的火车票售票系统/基于django的火车购票系统
  • 产品经理基础知识
  • [译]如何构建服务器端web组件,为何要构建?
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • Angular6错误 Service: No provider for Renderer2
  • Facebook AccountKit 接入的坑点
  • HashMap ConcurrentHashMap
  • httpie使用详解
  • js如何打印object对象
  • Netty 4.1 源代码学习:线程模型
  • Nodejs和JavaWeb协助开发
  • Vue全家桶实现一个Web App
  • 从零开始在ubuntu上搭建node开发环境
  • 基于MaxCompute打造轻盈的人人车移动端数据平台
  • ------- 计算机网络基础
  • 今年的LC3大会没了?
  • 如何实现 font-size 的响应式
  • 手写一个CommonJS打包工具(一)
  • 再谈express与koa的对比
  • 中文输入法与React文本输入框的问题与解决方案
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • ​插件化DPI在商用WIFI中的价值
  • ​力扣解法汇总946-验证栈序列
  • #{}和${}的区别是什么 -- java面试
  • #Spring-boot高级
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (function(){})()的分步解析
  • (MATLAB)第五章-矩阵运算
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (九)信息融合方式简介
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (数据大屏)(Hadoop)基于SSM框架的学院校友管理系统的设计与实现+文档
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (五)关系数据库标准语言SQL
  • (学习日记)2024.02.29:UCOSIII第二节
  • (一) springboot详细介绍
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • (转)关于多人操作数据的处理策略
  • (自适应手机端)行业协会机构网站模板