关于Task 的疑问

手在键盘敲很轻 程序员  2021-05-10 10:03:53
假设我有一个方法是这样,当然,有可能我的语法是错的

Public async void Run (){
var rst=await xxx();
var rst2=xxx();
}

为什么要用第一种而不是第二种,好吧,异步。但我知道,对于接口来说,每个请求都是异步的,为啥还要在方法里面使用异步呢?
我觉得这是为了异步而异步。
如果是并行我还能理解,等待好几个方法执行完成再往下走嘛!这样或许可以提高执行效率。
应该是我对Task理解不够吧!望大神给个通俗易通的解析,感激不尽!!!
...全文
1399 点赞 收藏 24
写回复
24 条回复
正怒月神 05月13日
我觉得你可以试试下面的例子,看看情况。 其实你单单就一个xxx()方法,其实看不出具体await应用。 而有其他耗时方法时,就能体现了。
static void Main(string[] args)
        {
            Test();
            Console.ReadKey();
        }

        public static async Task Test()
        {
            Task t = T1();
            await T2();
            await t;
        }

        public static async Task T1()
        {
            Console.WriteLine("T1 begin");
            await Task.Delay(3000);
            Console.WriteLine("T1 end");
        }

        public static async Task T2()
        {
            Console.WriteLine("T2 begin");
            await Task.Delay(2000);
            Console.WriteLine("T2 end");
        }
回复 点赞
m0_49176541 05月13日
啊这。。。。
回复 点赞
引用 23 楼 wanghui0380 的回复:
[quote=引用 20 楼 好奇都是要学的 的回复:][quote=引用 9 楼 wanghui0380 的回复:]https://www.cnblogs.com/huangxincheng/p/14743654.html OK,你准备好看博客园了么,正好那些个喜欢乱攀关系的血案来了,正好这血案就是1年前那几个5年的新人给你标准回答,正好这有是一个喜欢乱攀关系的博主 请准备好。非要把线程和异步拿着一起乱攀关系的结果 “线程等于异步,所以请开线程,然后放定时,放变量,用定时器检测结果”
你说的问题很对, 但是你每回留言都有博客园, 看来你对博客园意见挺大 [/quote] 问题大不大,你自己看这里的问题就好,社会上的乱象我说了,你也未必看得到。我就只问你一句话,你别说别的,你只回答“是,还是不是” 请问“这个论坛的里的80%的问题本身是不是因为楼主误信博文资料引发的”[/quote] 这个不好回答你啊, 我重来不去博客园, 所以不知道博客园如何解释的 同步异步 await task 的使用。 但是这个帖子的人 明显没弄懂同步异步。
回复 点赞
wanghui0380 05月13日
引用 20 楼 好奇都是要学的 的回复:
[quote=引用 9 楼 wanghui0380 的回复:]https://www.cnblogs.com/huangxincheng/p/14743654.html OK,你准备好看博客园了么,正好那些个喜欢乱攀关系的血案来了,正好这血案就是1年前那几个5年的新人给你标准回答,正好这有是一个喜欢乱攀关系的博主 请准备好。非要把线程和异步拿着一起乱攀关系的结果 “线程等于异步,所以请开线程,然后放定时,放变量,用定时器检测结果”
你说的问题很对, 但是你每回留言都有博客园, 看来你对博客园意见挺大 [/quote] 问题大不大,你自己看这里的问题就好,社会上的乱象我说了,你也未必看得到。我就只问你一句话,你别说别的,你只回答“是,还是不是” 请问“这个论坛的里的80%的问题本身是不是因为楼主误信博文资料引发的”
回复 点赞
await 等待 我理解 本身 他也是同步的 , 当他和 Task 同用时候 , 他就是异步了 比如

Console.WriteLine("1" );
await PrintAsync();
Console.WriteLine("3" );
public static void PrintAsync()
{
     Console.WriteLine("2 ");
}

Console.WriteLine("1" );
await PrintAsync();
Console.WriteLine("3" );
public static void PrintAsync()
{
      Task tk1 = Task.Run(() =>
            {
                Thread.Sleep(5000);
                 Console.WriteLine("2 ");
            });
    
}
看下结果
回复 点赞
你要了解async await Task 都是什么意思
回复 点赞
引用 9 楼 wanghui0380 的回复:
https://www.cnblogs.com/huangxincheng/p/14743654.html OK,你准备好看博客园了么,正好那些个喜欢乱攀关系的血案来了,正好这血案就是1年前那几个5年的新人给你标准回答,正好这有是一个喜欢乱攀关系的博主 请准备好。非要把线程和异步拿着一起乱攀关系的结果 “线程等于异步,所以请开线程,然后放定时,放变量,用定时器检测结果”
你说的问题很对, 但是你每回留言都有博客园, 看来你对博客园意见挺大
回复 点赞
qq_45860132 05月12日
路过帮你顶。
回复 点赞
luj_1768 05月12日
讲到线程,实际上分为:工作线程和守护线程,或者轻线程和重线程,或者占用cpu多的线程和基本不占用系统计算能力的线程。 同步和异步,是两种工作模式,就像即时通话和短信通知。 线程是系统解决所有工作模式的底层,所有工作模式最终通过线程管理实现。
回复 点赞
接口里, 同步写法,你的sql操作会浪费一个线程等待结果的返回。 至于异步写法,上面说的人也挺多的了。 写法实际上的异步会更好些,不过实际上使用的时候区别不是很大。
回复 点赞
xiaoxiangqing 05月11日
task就是异步
回复 点赞
引用 9 楼 wanghui0380 的回复:
https://www.cnblogs.com/huangxincheng/p/14743654.html OK,你准备好看博客园了么,正好那些个喜欢乱攀关系的血案来了,正好这血案就是1年前那几个5年的新人给你标准回答,正好这有是一个喜欢乱攀关系的博主 请准备好。非要把线程和异步拿着一起乱攀关系的结果 “线程等于异步,所以请开线程,然后放定时,放变量,用定时器检测结果”
老哥,你可以就线程,同步异步这些问题单独写一篇博客啊。
回复 点赞
xuzuning 05月10日
你觉得这是为了异步而异步。 那你就不用就是了,本来就没有必要跟在别人屁股后面转
回复 点赞
Eason0807 05月10日
简单说为啥异步方法要await呢?因为微软给的语法糖啊,其实你可以不这么写的 你可以写回调方法,也能获取异步结果; 而微软就是为了让异步在写法上与同步趋于一致,所以设计了async与await这种模式; 我印象里Task是先有的,那时候是没有async与await的,想拿到异步结果就只能写回调方法;
回复 点赞
wanghui0380 05月10日
https://www.cnblogs.com/huangxincheng/p/14743654.html OK,你准备好看博客园了么,正好那些个喜欢乱攀关系的血案来了,正好这血案就是1年前那几个5年的新人给你标准回答,正好这有是一个喜欢乱攀关系的博主 请准备好。非要把线程和异步拿着一起乱攀关系的结果 “线程等于异步,所以请开线程,然后放定时,放变量,用定时器检测结果”
回复 点赞
wanghui0380 05月10日
引用 7 楼 手在键盘敲很轻 的回复:
可能我刚刚没有描述清楚,如上,我 ExcuteSql 与 ExcuteSql2 做同样的事,为什么要写成异步?
我们说了异步和同步才是一组概念。 所以你问我们为啥要异步,那么我们就只能问,你想同步么??异步的概念是“我让别的人做,做好了通知我,同时在这个期间我还可以做其他的事情” 同步的意思是“我让别人做,但是现在我等着他做完,这期间我啥也不做,就站在他背后盯着他” iis,wcf是多线程了,可以并行访问了。但是他并行了,你就不管了???不管可以,不管的话,那就请移步到博客园去讨论“血案”就行了
回复 点赞
wanghui0380 05月10日
引用 1 楼 手在键盘敲很轻 的回复:
我的是接口指的是wcf、webapi...这种接口!
接口跟你的问题有关系么?没关系,不要胡乱联系。是,你可以说你是iis的,iis每个访问都是独立线程。 独立线程和异步有关系么??线程是线程,异步是异步。还是那句话少看博客园,线程和异步本身就是两个独立概念。 线程是cpu并发,单线程和多线程是一组概念 异步是IO--------同步IO和异步IO才是一组概念 所以,你wcf如何,webapi如何,根本就和你讨论的题目没有1毛钱的关系。不要学博客园那种乱攀关系的搞法。你想乱攀关系,那就请做好去讨论String血案的准备,很简单,为啥博客园们整天折腾一个string。因为他们喜欢把各种名词和概念乱攀关系。 是的,如果你认为wcf就是异步,ok,那么你可以不await,那么如果这个Run需要执行5秒,那么他就执行5秒,如果这个run里有个string,ok,这个5秒string不释放的,因为你还在用着,所以他们开始乱攀关系了。string让我的系统崩溃了。我们说不是string让你的系统崩溃的,是你自己写的东西让你系统崩溃的 await xxx()则是另外的东西,他回拆成更小的执行单元,这些更小的执行单元,会把你的5秒,拆成N个更小的执行单元,假设其中一个要用string的单元只要1秒钟,他执行完毕string不用了。你猜博客园们的那个最喜欢的锅string还有木有??
回复 点赞

 public async Task<bool> ExcuteSql() {
            //执行插入数据
            return true;
        }
        public bool ExcuteSql_2() {
            //执行插入数据
            return true;
        }
        public async void InsertData() {
            var rst = await ExcuteSql();
            var rst2 = ExcuteSql_2();
        }
回复 点赞
guanyinsishengzi 05月10日
await是异步等待 如果xxx是个异步方法。 var ss = await xxx() 就是异步等待返回结果。 xxx();是异步执行,不考虑返回结果 var ss = xxx().Result 是同步获取返回结果。 举个例子: public void Method1(){ 打印日志 11 Method2() 打印日志22 } public async void Method2(){ 代码段1 打印日志33 await xxx();//xxx()比较耗时 可用Task.Delay()代替测试 打印日志44 代码段2 打印日志55 } 日志顺序为 11 33 22 44 55,也就是Method2执行完代码段1就先返回了 建议百度.net awai机制
回复 点赞
发动态
发帖子
C#
创建于2007-09-28

8.5w+

社区成员

64.0w+

社区内容

.NET技术 C#
社区公告
暂无公告