码迷,mamicode.com
首页 > 编程语言 > 详细

异步线程调用之task await关键字

时间:2014-09-24 22:17:47      阅读:211      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   ar   for   数据   div   sp   

有这样一个场景:一个异步方法a,被foreach循环b调用,这个时候,还没来得及处理异步返回的数据c,就会执行下一个循环,

所有循环b执行完的时候,再次回到异步方法a会因为void关键字,捕捉不到先前的数据c

eg:

 private void GetSecondinfo(IEnumerable<Info> info)
        {
            foreach (var info1 in info)
            {
                SecondResult(info1.category);
            }
        }

private async void SecondResult(string category)
        {
            string url = "http://xxx" + category;
            string content = await PublicMethod.AsyncCallbac1(url);
            //foreach执行完了才会执行下面方法,但是这个时候因为void关键字的原因,content已经为null
            if (!string.IsNullOrEmpty(content))
            {
           //json解析
            }
        }

  分析看来,关键字void很重要,所以我们的处理方法就有2种:

第一种,改造2个方法为一个,把第二个方法挪到里面去。因为foreach await后会执行下一个判断操作,而非继续下一个循环,所以可以解决问题,

注意要把同步方法改成异步,即加async。这样的处理逻辑是:foreach循环的时候,异步请求网络,接着json解析完,然后开始第二轮foreach循环。

eg:

        private async void GetSecondinfo1(IEnumerable<Info> info)
        {
            foreach (var info1 in info)
            {
                string url = "http://xxx" + category;
                string content = await PublicMethod.AsyncCallbac1(url);
                //foreach执行完了才会执行下面方法,因为没有别的方法调用,只能执行下面方法
                if (!string.IsNullOrEmpty(content))
                {
                    //json解析
                }
            }
        }

  第二种方法:因为知道 是void导致的问题(具体原因不知道,可能是void关键字默认屏蔽所有值),关于异步方法,可以改void为task。此为群里朋友提供的方法,

这样处理的逻辑是:foreach的时候,异步请求网络,不等结果,继续去请求第二个线程,最后一刻处理json解析

eg:

private void GetSecondinfo(IEnumerable<Info> info)
        {
            foreach (var info1 in info)
            {
                SecondResult(info1.category);
            }
        }
        private async Task SecondResult(string category)
        {
            string url = "http://xxx" + category;
            string content = await PublicMethod.AsyncCallbac1(url);
            //foreach执行完了才会执行下面方法,但是这个时候因为木有void,而是task,所以content不会为因为执行了异步操作而空;
            if (!string.IsNullOrEmpty(content))
            {
                //json解析
            }
        }

  

异步线程调用之task await关键字

标签:style   blog   http   color   ar   for   数据   div   sp   

原文地址:http://www.cnblogs.com/defoliate/p/3991322.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!