C#异步Async、Task、Await

参考http://www.cnblogs.com/jesse2013/p/async-and-await.html

事例:

static void Main(string[] args)
        {
            for (int i = 0; i < 4; i++)
            {
                TestAsync();
            }

            Console.ReadLine();
        }

        static async Task TestAsync()
        {
            Console.WriteLine("Test()开始, Thread Id: {0}\r\n", Thread.CurrentThread.ManagedThreadId);
            var name = GetNameAsync();   //我们这里没有用 await,所以下面的代码可以继续执行
            // 但是如果上面是 await GetNameAsync(),下面的代码就不会立即执行,输出结果就不一样了。            
            var res = await name;
            //
            Console.WriteLine("await GetName1: {0},得到结果进行其它操作", res );
            Console.WriteLine("Test()结束.\r\n"); 
        }

        static async Task<string> GetNameAsync()
        {
            // 这里还是主线程
            Console.WriteLine("GetName()开始, thread Id is: {0}", Thread.CurrentThread.ManagedThreadId);
            return await Task.Run(() =>
            {
                Thread.Sleep(1000);
                Console.WriteLine("'GetName' Thread Id: {0}", Thread.CurrentThread.ManagedThreadId);
                return "Jesse";
            });
        }

、、、、

static async Task Test(){
    Task<string> task = Task.Run(() =>{
        Console.WriteLine("另一个线程在运行!");  // 这句话只会被执行一次
        Thread.Sleep(2000);
        return "Hello World";
    });
 
    // 这里主线程会挂起等待,直到task执行完毕我们拿到返回结果
    var result = task.GetAwaiter().GetResult(); 
    // 这里不会挂起等待,因为task已经执行完了,我们可以直接拿到结果
    var result2 = await task;    
    Console.WriteLine(str);
}
posted @ 2017-03-02 16:39  chenjingchun  阅读(10966)  评论(0编辑  收藏  举报