.Net6.0系列-3.Net 6及以上异步编程(二)

本文介绍了异步方法并不等同于多线程,异步代码默认不会在新线程中执行,除非使用Task.Run。使用async和await能提高代码可读性,但会生成额外的类,影响效率。对比了Thread.Sleep()与awaitTask.Delay()在并发处理上的区别,前者会阻塞当前线程,后者允许其他任务继续执行。
摘要由CSDN通过智能技术生成

一.异步方法不等于多线程,异步方法的代码并不会自动在新线程中执行除非手动将代码放到新线程中

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);
}

public static async Task<double> CalcAsync(int n)
{
    //下面这段代码输出的线程ID调用前和调用后的线程ID是一致的
	/*
	Console.WriteLine("CalcAsync,"+Thread.CurrentThread.ManagedThreadId);
	double result=0;
	Random=new Random();
	for(int i=0;i<n;i++)
	{
		result=rand.NextDouble();
	}
	return result ;*/
	//下面这段代码输出的线程ID,调用前和调用后的线程ID不一致,输出的是新线程ID
	return await task.Run(()=>
	{
		Console.WriteLine("CalcAsync,"+Thread.CurrentThread.ManagedThreadId);
		double result=0;
		Random rand=new Random();
		for(int i=0;i<n*n;i++)
		{
			result+=rand.NextDouble();
		}
		return result;
	});
}
//下面是直接将Task运行完成之后的结果封装到Task里面,而没有await
public static Task<double> Calc2Async(int n)
{
	return Task.Run(()=>{
		Console.WriteLine("CalcAsync,"+Thread.CurrentThread.ManagedThreadId);
		double result=0;
		Random rand=new Random();
		for(int i=0;i<n*n;i++)
		{
			result=result+rand.NextDouble();
		}
		return Task.FromResult(result);
	})
}

二.为什么有的异步没有用async修饰
async方法的缺点:1.异步方法会生成一个类,运行效率没有普通方法高 2.可能会占用非常多的线程
标明async只是为了更方便的使用await,第二种没有使用async,如果需要将Task的结果拿出来进行操作的时候
需要使用async和await

static async Task Main(string[] args)
{
	string s=await ReadAsync(1);
	Console.WriteLine(s);
}
//第一种写法
static async Task<string> ReadAsync(int num)
{
	if(num==1)
	{
		string s=await File.ReadAllTextAsync(@"e:\temp\a\1.txt");
		return s;
	}
	else if(num==2)
	{
		string s=await File.ReadAllTextAsync(@"e:\temp\a\2.txt");
		return s;
	}
}
//第二种写法,这种写法效率高,ReadAsync的返回值类型为Task<string>
static Task<string> ReadAsync(int num)
{
	if(num==1)
	{
		return File.ReadAllTextAsync(@"e:\a\1.txt");
	}
	else if(num==2)
	{
		return File.ReadAllTextAsync(@"e:\a\2.txt");
	}
}

三 .为什么尽量少使用Thread.Sleep();
Thread.Sleep(3000)与await Task.Delay(3000)的区别
Thread.Sleep():终止的是当前线程,会降低并发(类似于接线员停止了)
await Task.Delay():是编译后的MoveNext中延时(我们打10086停止说话,但是接线员可以去接别人的电话)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值