引言
你认为当调用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 并不一定会调用新的线程,只有主动将代码运行与新线程才会调度新线程。