await

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

namespace ConsoleApp2
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Threading;

    namespace AsyncAndAwait_Test
    {
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("主线程ManagedThreadId:" + Thread.CurrentThread.ManagedThreadId);
                AsyncTest();
                Console.WriteLine("主线程ManagedThreadId2:" + Thread.CurrentThread.ManagedThreadId);
                Console.ReadKey();
            }

            static async void AsyncTest()
            {
                Console.WriteLine("*******Start************ManagedThreadId:" + Thread.CurrentThread.ManagedThreadId);
                Task<int> taskA = Print();
                Console.WriteLine("*********Middle**********ManagedThreadId:" + Thread.CurrentThread.ManagedThreadId);
                int a = await taskA;
                Console.WriteLine("*********End**********ManagedThreadId:" + Thread.CurrentThread.ManagedThreadId);
            }


            static Task<int> Print()
            {
                var tcs = new TaskCompletionSource<int>();
                var thrd = new Thread(() =>
                {
                    Console.WriteLine("子线程ManagedThreadId:" + Thread.CurrentThread.ManagedThreadId);
                    for (int i = 0; i < 3; i++)
                    {
                        Console.WriteLine("===========等待==========" + i);
                        System.Threading.Thread.Sleep(1000);
                    }
                    tcs.SetResult(99);

                });
                thrd.Start();
                return tcs.Task;
            }
        }
    }


}

  await 应该是 先检查 task 的结果 如果已经有返回值  则不切换环境(线程) 如果没有则要另开线程去等待。切换线程
  测试方法 可以修改  tcs1.SetResult(100); 前的延时观察 线程ID 的变化

 

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

namespace AsyncAndAwait_Test
{
    class Program
    {
        /// <summary>
        /// async 和await 实践测试
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {

            var tcs1 = new TaskCompletionSource<int>();
            var tcs2 = new TaskCompletionSource<int>();
            Console.WriteLine("主线程ManagedThreadId:" + Thread.CurrentThread.ManagedThreadId);
            AsyncTest(tcs1, tcs2);
            Console.WriteLine("主线程2ManagedThreadId:" + Thread.CurrentThread.ManagedThreadId);
            Thread.Sleep(5000);
            tcs1.SetResult(100);
           // tcs1.SetCanceled();
            Thread.Sleep(5000);
            tcs2.SetResult(100);
            Console.WriteLine("主线程结束ManagedThreadId:" + Thread.CurrentThread.ManagedThreadId);
            Console.ReadKey();
        }
        static async void AsyncTest(TaskCompletionSource<int> tcs1, TaskCompletionSource<int> tcs2)
        {
            try
            {
                Console.WriteLine("AsyncTest方法执行的线程id:" + Thread.CurrentThread.ManagedThreadId);
                //await后线程出现变化,异步执行(线程id不一样)
                int a = await Print();
                Console.WriteLine("Print 1****await tcs3后的线程id:" + Thread.CurrentThread.ManagedThreadId);
                // await 应该是 先检查 task 的结果 如果已经有返回值  则不切换环境(线程) 如果没有则要另开线程去等待。切换线程
                //测试方法 可以修改  tcs1.SetResult(100); 前的延时观察 线程ID 的变化
                int b = await tcs1.Task;
                Console.WriteLine("11****await tcs1后的线程id:" + Thread.CurrentThread.ManagedThreadId);


                int c = await  Print();
                Console.WriteLine("Print 2****await tcs1后的线程id:" + Thread.CurrentThread.ManagedThreadId);

                await dodeleytime();
                int d = await tcs2.Task;
                Console.WriteLine("22****await tcs2后的线程id:" + Thread.CurrentThread.ManagedThreadId);
            }
            catch(Exception e)
            {
                Console.WriteLine("yyss****await 后的线程id:" + Thread.CurrentThread.ManagedThreadId+" "+e.Message);
            }
            
        }

        public static async Task dodeleytime()
        {
            Console.WriteLine("dodeleytime前的线程id:" + Thread.CurrentThread.ManagedThreadId);
            await Task.Delay(20);
            Console.WriteLine("dodeleytime后的线程id:" + Thread.CurrentThread.ManagedThreadId);
        }
        static Task<int> Print()
        {
            var tcs3 = new TaskCompletionSource<int>();
            var thrd = new Thread(() =>
            {
                Console.WriteLine("子线程ManagedThreadId:" + Thread.CurrentThread.ManagedThreadId);
                for (int i = 0; i < 3; i++)
                {
                    Console.WriteLine("===========等待==========" + i);
                    System.Threading.Thread.Sleep(1000);
                }
                tcs3.SetResult(99);

            });
            thrd.Start();
            return tcs3.Task;
        }
    }
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值