首页 > Windows开发 > 详细

C#异步编程(一):异步基础

时间:2015-10-23 16:14:23      阅读:257      评论:0      收藏:0      [点我收藏+]
class Program
    {
        static void Main(string[] args)
        {
            var result = DownloadStringWithTimeout("http://www.yueyangdujia.com");
            Console.WriteLine("异步方法执行中");
            for (int i = 0; i < 3; i++)
            {
                System.Threading.Thread.Sleep(1000);
                Console.WriteLine("休息了"+(i+1)+"");
            }     
            var str= result.Result;   //这里使用到异步方法的返回值,需要等待异步方法执行完毕。         
            Console.WriteLine("异步方法执行后,同步执行以下代码");
            Console.WriteLine(str);
            Console.Read();
        }

        static async Task<string> DownloadStringWithTimeout(string uri)
        {
            using (var client=new HttpClient())
            {
                var downloadTask = client.GetStringAsync(uri);
                var timeoutTask = Task.Delay(3000);

                var completedTask = await Task.WhenAny(downloadTask, timeoutTask);
                if (completedTask == timeoutTask)
                {
                    System.Threading.Thread.Sleep(2000);
                    Console.WriteLine("异步方法执行完成");
                    return null;
                }
                System.Threading.Thread.Sleep(2000);
                Console.WriteLine("异步方法执行完成");
                return await downloadTask;
            }
            
        }
    }

执行顺序如 Console.WriteLine显示一样。DownloadStringWithTimeout和下面的代码一起执行,大概在2秒的时候执行完毕。var str= result.Result;调用异步方法返回值的时候会等候异步方法执行。




下来去掉一些代码如下:
    class Program
    {
        static void Main(string[] args)
        {
            var result = DownloadStringWithTimeout("http://www.yueyangdujia.com");         
            var str= result.Result;   //这里使用到异步方法的返回值,需要等待异步方法执行完毕。                   
            Console.WriteLine(str);
            Console.Read();
        }

        static async Task<string> DownloadStringWithTimeout(string uri)
        {
            using (var client=new HttpClient())
            {
                var downloadTask = client.GetStringAsync(uri);
                var timeoutTask = Task.Delay(3000);
                var completedTask = await Task.WhenAny(downloadTask, timeoutTask);
                if (completedTask == timeoutTask)
                {
                
                    return null;
                }
                return await downloadTask;
            }
            
        }
    }

WhenAny接受两个异步方法参数返回先执行的方法。以上可以调整Task.Delay的参数。如果足够小则返回NULL。

 

C#异步编程(一):异步基础

原文:http://www.cnblogs.com/harpz/p/4904742.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!