异步编程Async之使用await也不一定是多线程(2)
引言
你认为当调用await一定会分配新线程吗?
一、代码展示
using System;
using System.IO;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace _02_awiait_and_task
{
class Program
{
static async Task Main(string[] args)
{
Console.WriteLine("-----程序开始-----");
int ProgramStart = Thread.CurrentThread.ManagedThreadId;
Console.WriteLine($"线程id=={ProgramStart}");
// 使用await调用方法
await write();
Console.WriteLine("-----await-----结束");
int ThreadIdWiriteEnd = Thread.CurrentThread.ManagedThreadId;
Console.WriteLine($"线程id=={ThreadIdWiriteEnd}");
}
public static async Task write()
{
Console.WriteLine("-----进入await 方法了-----");
int ThreadIdWirite = Thread.CurrentThread.ManagedThreadId;
Console.WriteLine($"线程id=={ThreadIdWirite}");
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10; i++)
{
sb.Append("xxxxxxxxxxx");
}
File.WriteAllText(@"C:\Users\DELL\Desktop\1.txt", sb.ToString());
}
}
}
二、运行结果
这是因为虽然使用await方法,但方法里面并没有主动将代码放到新线程中执行,而代码不会自己调用新线程
三、主动调用新线程
将wirte函数替换成如下代码
//使用委托
await Task.Run(() =>
{
Console.WriteLine("-----进入await 方法了-----");
int ThreadIdWirite = Thread.CurrentThread.ManagedThreadId;
Console.WriteLine($"线程id=={ThreadIdWirite}");
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10; i++)
{
sb.Append("xxxxxxxxxxx");
}
File.WriteAllText(@"C:\Users\DELL\Desktop\1.txt", sb.ToString());
});
这里调用await后,使用了新线程
四、总结
await 并不一定会调用新的线程,只有主动将代码运行与新线程才会调度新线程。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)