C# 5.0 新特性 async和await

1:  async和await 是 C# 5.0 的新特性

2:  需要.net Framework 4.5,或更高级版本才能使用  

3: 需要VS2012,或更高级版本才能使用

4:它是用来配合 Task.Run(()=>{   这里写代码   });来使用的,Task.Run是一个很方便的异步执行

5: 使用方法:

     在任何方法前面加关键字  async ,比如:

        public static void Main(string[] args)
        {
            Program p = new Program();
            p.Print();
            Console.ReadKey();
        }

        public async void Print()
        {
            Console.WriteLine("1111111");
            Console.WriteLine("222222");
            Console.WriteLine("33333333");
        }

   大家可以看到我在这个方法前面加了一个async,有什么用呢?然并卵,只是告诉了你这个方法变成了支持异步的方法。这个时候打印的话,结果集还是按顺序来打印

C# 5.0 新特性 async和await_第1张图片

  大家还需要知道一个关键字:Task ,注意Task 才是核心,async和await只不过是用来服务Task的 ,它是Task的好基友,Task 可以轻松实现异步执行;你可以把要异步执行的东西都丢在里面,那怎么用呢?比如:

       public static void Main(string[] args)
        {
            Program p = new Program();
            p.Print();
            Console.ReadKey();
        }

        public async void Print()
        {
            Console.WriteLine("1111111");
            Task.Run(() => {
                Thread.Sleep(2000);
                Console.WriteLine("222222");
            });
            Console.WriteLine("33333333");
        }

再看看打印的结果,你会发现2222被异步执行了,先执行了11111和33333,2秒以后才出现了了222222

C# 5.0 新特性 async和await_第2张图片

但是这些操作和async没有任何关系,你去掉方法的async也一样可以执行,而且结果一模一样,别急,这个时候我们再加关键字

await   ,await   必须在有 关键字 async的方法中才可使用,所以代码如下:

        public static void Main(string[] args)
        {
            Program p = new Program();
            p.Print();
            Console.ReadKey();
        }

        public async void Print()
        {
            Console.WriteLine("1111111");
            await Task.Run(() => {
                Thread.Sleep(2000);
                Console.WriteLine("222222");
            });
            Console.WriteLine("33333333");
        }

 这个时候再看看运行结果

C# 5.0 新特性 async和await_第3张图片

  所以你现在理解了await的意思了吗?其实就是等待,一直等待到异步完成为止;这种需求很少吧?大多情况都用不到,但是如果有需求的话,可以用这种方式,这种比较代码比较清晰一些;当然也有更高深的运用,封装好多好多代码,这里就不说了,知道他的意思就好了。

 

另外异步的写法要写代码的话也可以这样:

//不带参数
                    Task.Run(() =>
                    {
                      //异步
                    }).GetAwaiter().OnCompleted(() =>
                    {
                      //回调
                    });



//带参数
                    Task task = Task.Run(() =>
                    {
                        return string.Empty;
                        //异步
                    });
                    task.GetAwaiter().OnCompleted(() =>
                    {
                        Console.WriteLine(task.Result);
                    });

 

你可能感兴趣的:(技术研究,代码库)