public void testGreetingClient()
        {
            //下面是这个过程的输出
            //2020.07.17 10:11:55:536 testGreetingClient enter in thread 13 and no task
            //2020.07.17 10:11:55:538 callGreetingClientAsync enter in thread 13 and no task
            //2020.07.17 10:11:55:539 running GreetingAsync in thread 11 and task 1
            //2020.07.17 10:11:55:539 running Greeting in thread 11 and task 1
            //2020.07.17 10:11:55:539 testGreetingClient got Task<String> greetingResult, and next to get greetingResult.Result in thread 13 and no task
            //这里有个500毫秒的gap(当时Greeting方法正在blocking wait)
            //2020.07.17 10:11:56:050 callGreetingClientAsync done in thread 11 and no task
            //2020.07.17 10:11:56:050 testGreetingClient done - got greetingResult.Result:Hello, HanMeiMei in thread 13 and no task

            ThirdPartyAsyncSimulator greetingClient = new ThirdPartyAsyncSimulator();

            //线程A - 调用者当前线程
            ThreadEval_Util.TraceThreadAndTask($"{nameof(testGreetingClient)} enter");
            Task <String> greetingResult = callGreetingClientAsync();

            ThreadEval_Util.TraceThreadAndTask($"{nameof(testGreetingClient)} got Task<String> greetingResult, and next to get greetingResult.Result");

            //线程A - 前面都很快,而执行这个获取task结果卡住了,因为结果还没有出来
            String greetingResultStr = greetingResult.Result;

            //线程A - 这里线程没变
            ThreadEval_Util.TraceThreadAndTask($"{nameof(testGreetingClient)} done - got greetingResult.Result:{greetingResultStr}");
        }
        public async Task <String> callGreetingClientAsync()
        {
            ThirdPartyAsyncSimulator greetingClient = new ThirdPartyAsyncSimulator();

            //线程A - 就是调用者所在的线程
            ThreadEval_Util.TraceThreadAndTask($"{nameof(callGreetingClientAsync)} enter");
            Task <String> greetingResult = greetingClient.GreetingAsync("HanMeiMei");

            //一旦开始await,这个方法就返回了。调用方法立马得到了Task<String>的结果
            //String greetingResultStr = await greetingResult;

            //这里使用await greetingResult与 await greetingResult.ConfigureAwait(false)是一样的
            //note:但是如果是UI程序,或者asp.net则不一样
            //使用ConfigureAwait(false)的目的是让醒来后的线程可以是随意一个线程池中的线程
            //见本类开头更多总结
            String greetingResultStr = await greetingResult.ConfigureAwait(false);

            //线程B - await之后,task执行之后,处理执行结果是其他线程(不再保证是进入是的线程A)
            ThreadEval_Util.TraceThreadAndTask($"{nameof(callGreetingClientAsync)} done");
            return(greetingResultStr);
        }