async方法中 使用await 和 不使用await 示例

using System;
using System.Text;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;

namespace Test
{
    class Program
    {

        /// <summary>
        /// 异步使用线程池新线程执行
        /// </summary>
        private static async Task<string> GetAwaitString(string str)
        {
            await Task.Delay(3000);

            Console.WriteLine("GetAwaitString:线程Id:【{0}】是否后台线程:【{1}】是否使用线程池:【{2}】当前时间:【{3}】",
                Environment.CurrentManagedThreadId.ToString(),
                Thread.CurrentThread.IsBackground,
                Thread.CurrentThread.IsThreadPoolThread,
                DateTime.Now.ToString());

            return String.Format("{0}-{1}", str, Environment.CurrentManagedThreadId.ToString());
        }

        private static string GetString(string str)
        {
            var task = GetAwaitString(str);

            Console.WriteLine("GetString:线程Id:【{0}】是否后台线程:【{1}】是否使用线程池:【{2}】当前时间:【{3}】",
                Environment.CurrentManagedThreadId.ToString(),
                Thread.CurrentThread.IsBackground,
                Thread.CurrentThread.IsThreadPoolThread,
                DateTime.Now.ToString());

            return task.Result;
        }


        static void Main()
        {
            Console.WriteLine("Main:线程Id:【{0}】是否后台线程:【{1}】是否使用线程池:【{2}】当前时间:【{3}】",
                Environment.CurrentManagedThreadId.ToString(),
                Thread.CurrentThread.IsBackground,
                Thread.CurrentThread.IsThreadPoolThread,
                DateTime.Now.ToString());

            string str = GetString("abc");
            Console.WriteLine("结果:{0},{1}", str, DateTime.Now.ToString());

            Console.WriteLine("执行完成:线程Id:【{0}】是否后台线程:【{1}】是否使用线程池:【{2}】当前时间:【{3}】",
              Environment.CurrentManagedThreadId.ToString(),
              Thread.CurrentThread.IsBackground,
              Thread.CurrentThread.IsThreadPoolThread,
              DateTime.Now.ToString());


            Console.ReadLine();
        }
    }
}

 

使用 await Task.Delay(3000);

/*
 * await Task.Delay(3000);
Main:线程Id:【9】是否后台线程:【False】是否使用线程池:【False】当前时间:【2016/9/12 14:34:11】
GetString:线程Id:【9】是否后台线程:【False】是否使用线程池:【False】当前时间:【2016/9/12 14:34:11】
GetAwaitString:线程Id:【6】是否后台线程:【True】是否使用线程池:【True】当前时间:【2016/9/12 14:34:14】
结果:abc-6,2016/9/12 14:34:14
执行完成:线程Id:【9】是否后台线程:【False】是否使用线程池:【False】当前时间:【2016/9/12 14:34:14】

 */
( 14 - 11 = 3 ) await 使用了新线程和线程池。

 

不使用 //await Task.Delay(3000);

/*
 * //await Task.Delay(3000);
Main:线程Id:【8】是否后台线程:【False】是否使用线程池:【False】当前时间:【2016/9/12 14:35:02】
GetAwaitString:线程Id:【8】是否后台线程:【False】是否使用线程池:【False】当前时间:【2016/9/12 14:35:02】
GetString:线程Id:【8】是否后台线程:【False】是否使用线程池:【False】当前时间:【2016/9/12 14:35:02】
结果:abc-8,2016/9/12 14:35:02
执行完成:线程Id:【8】是否后台线程:【False】是否使用线程池:【False】当前时间:【2016/9/12 14:35:02】

*/

同步执行

 

posted @ 2016-09-12 14:39  茗::流  阅读(2891)  评论(0)    收藏  举报
如有雷同,纯属参考。如有侵犯你的版权,请联系我。