首页 > 技术文章 > 一个单元测试 学习 aysnc await

duanweishi 2015-07-27 12:16 原文

 

using System;
using System.Threading.Tasks;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace ypp.tests
{
    [TestClass]
    public class AysncTest
    {
        [TestMethod]
        public  void TestMethod1()
        {
            Console.WriteLine("testStart:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm ss"));
            var xx = GetNick();

            Console.WriteLine("testEnd:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm ss"));
            
          
            //xx();
        }

        public async Task<string> GetNick()
        {
            return await Task.Run(() =>
            {
                //等待10秒
                System.Threading.Thread.Sleep(1000 * 10);
                var strNow = DateTime.Now.ToString("yyyy-MM-dd HH:mm ss");
                Console.WriteLine("NotifyChange:" + strNow);
                return strNow;
            });
        }

        
    }
}

 

输出结果:

 

 

简单说明:

1. async 用来标记 该方式是否 支持异步( 如果方法体内没有 await 的话,则和正常同步方法一样),方法体内要有 await才能起到 异步效果 await==async wait

2. 当这么写的时候 会忽略异步 直接同步执行

        [TestMethod]
        public  void TestMethod1()
        {
            Console.WriteLine("testStart:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm ss"));
            var xx = GetNick().Result;

            Console.WriteLine("testEnd:" + DateTime.Now.ToString("yyyy-MM-dd HH:mm ss"));
            
          
            //xx();
        }

 

 

从逐渐剖析Async中发现,Net提供的异步方式基本上一脉相承的,如:
1. net4.5的Async,抛去语法糖就是Net4.0的Task+状态机。 
2. net4.0的Task, 退化到3.5即是(Thread、ThreadPool)+实现的等待、取消等API操作。

推荐阅读