C#中异步使用及回调

1. 一句话理解异步

   我叫你去吃饭,叫完你不去,那我就会一直等你,直到你和我一起去吃饭。这叫同步!

   我叫你去吃饭,叫完不管你去不去,我都不会等你,我自己去吃饭。这叫异步!

2. 异步使用

        static void Main(string[] args)
        {
            Console.WriteLine("----------主程序开始,线程ID是{0}-----------------", Thread.CurrentThread.ManagedThreadId);


            Action<string> action = t =>
            {
                for (int k = 0; k < 1000000000; k++)
                { }
                Console.WriteLine("当前参数是{1},当前线程是{0}", Thread.CurrentThread.ManagedThreadId,t);
            };

            action.BeginInvoke("异步参数",null,null);

            Console.WriteLine("----------主程序结束,线程ID是{0}-----------------", Thread.CurrentThread.ManagedThreadId);

            Console.Read();
        }

3. 异步回调

        static void Main(string[] args)
        {
            Console.WriteLine("----------主程序开始,线程ID是{0}-----------------", Thread.CurrentThread.ManagedThreadId);


            Action<string> action = t =>
            {
                for (int k = 0; k < 1000000000; k++)
                { }
                Console.WriteLine("当前参数是{1},当前线程是{0}", Thread.CurrentThread.ManagedThreadId,t);
            };
            AsyncCallback callback = t =>
            {
                Console.WriteLine("这里是回调函数 当前线程是{0}", Thread.CurrentThread.ManagedThreadId);
            };
            action.BeginInvoke("异步参数", callback, null);

            Console.WriteLine("----------主程序结束,线程ID是{0}-----------------", Thread.CurrentThread.ManagedThreadId);

            Console.Read();
        }


4. 异步回调带参数


        static void Main(string[] args)
        {
            Console.WriteLine("----------主程序开始,线程ID是{0}-----------------", Thread.CurrentThread.ManagedThreadId);

            Action<string> action = t =>
            {
                for (int k = 0; k < 1000000000; k++)
                { }
                Console.WriteLine("当前参数是{1},当前线程是{0}", Thread.CurrentThread.ManagedThreadId,t);
            };
            AsyncCallback callback = t =>
            {
                Console.WriteLine(t.AsyncState);
                Console.WriteLine("这里是回调函数 当前线程是{0}", Thread.CurrentThread.ManagedThreadId);
            };
            action.BeginInvoke("异步参数", callback, "无名小虾");

            Console.WriteLine("----------主程序结束,线程ID是{0}-----------------", Thread.CurrentThread.ManagedThreadId);

            Console.Read();
        }


5. 异步等待

第一种方式:IsCompleted

        static void Main(string[] args)
        {
            Console.WriteLine("----------主程序开始,线程ID是{0}-----------------", Thread.CurrentThread.ManagedThreadId);

            Action<string> action = t =>
            {
                for (int k = 0; k < 1000000000; k++)
                { }
                Console.WriteLine("当前参数是{1},当前线程是{0}", Thread.CurrentThread.ManagedThreadId,t);
            };
            AsyncCallback callback = t =>
            {
                Console.WriteLine(t.AsyncState);
                Console.WriteLine("这里是回调函数 当前线程是{0}", Thread.CurrentThread.ManagedThreadId);
            };
            IAsyncResult asyncResult = action.BeginInvoke("异步参数", callback, "无名小虾");

            while (!asyncResult.IsCompleted)
            {
                Console.WriteLine("等待中......");
                Thread.Sleep(200);
            }

            Console.WriteLine("----------主程序结束,线程ID是{0}-----------------", Thread.CurrentThread.ManagedThreadId);

            Console.Read();
        }

第二种方式:WaitOne()

        static void Main(string[] args)
        {
            Console.WriteLine("----------主程序开始,线程ID是{0}-----------------", Thread.CurrentThread.ManagedThreadId);

            Action<string> action = t =>
            {
                for (int k = 0; k < 1000000000; k++)
                { }
                Console.WriteLine("当前参数是{1},当前线程是{0}", Thread.CurrentThread.ManagedThreadId,t);
            };
            AsyncCallback callback = t =>
            {
                Console.WriteLine(t.AsyncState);
                Console.WriteLine("这里是回调函数 当前线程是{0}", Thread.CurrentThread.ManagedThreadId);
            };
            IAsyncResult asyncResult = action.BeginInvoke("异步参数", callback, "无名小虾");

            asyncResult.AsyncWaitHandle.WaitOne();

            Console.WriteLine("----------主程序结束,线程ID是{0}-----------------", Thread.CurrentThread.ManagedThreadId);

            Console.Read();
        }

第三种方式:EndInvoke()

        static void Main(string[] args)
        {
            Console.WriteLine("----------主程序开始,线程ID是{0}-----------------", Thread.CurrentThread.ManagedThreadId);

            Action<string> action = t =>
            {
                for (int k = 0; k < 1000000000; k++)
                { }
                Console.WriteLine("当前参数是{1},当前线程是{0}", Thread.CurrentThread.ManagedThreadId,t);
            };
            AsyncCallback callback = t =>
            {
                Console.WriteLine(t.AsyncState);
                Console.WriteLine("这里是回调函数 当前线程是{0}", Thread.CurrentThread.ManagedThreadId);
            };
            IAsyncResult asyncResult = action.BeginInvoke("异步参数", callback, "无名小虾");

            action.EndInvoke(asyncResult);

            Console.WriteLine("----------主程序结束,线程ID是{0}-----------------", Thread.CurrentThread.ManagedThreadId);

            Console.Read();
        }


6. 异步返回值

主线程获取到返回值

        static void Main(string[] args)
        {
            Console.WriteLine("----------主程序开始,线程ID是{0}-----------------", Thread.CurrentThread.ManagedThreadId);

            Func<string,string> func = t =>
            {
                string result = "这是我的返回值";

                for (int k = 0; k < 1000000000; k++)
                { }
                Console.WriteLine("当前参数是{1},当前线程是{0},返回的参数是 {2}", Thread.CurrentThread.ManagedThreadId,t, result);
                return result;
            };

            IAsyncResult asyncResult = func.BeginInvoke("异步参数", null, null);

            string res = func.EndInvoke(asyncResult);

            Console.WriteLine("获取到返回值:{0}", res);

            Console.WriteLine("----------主程序结束,线程ID是{0}-----------------", Thread.CurrentThread.ManagedThreadId);

            Console.Read();
        }


回调获取到返回值

        static void Main(string[] args)
        {
            Console.WriteLine("----------主程序开始,线程ID是{0}-----------------", Thread.CurrentThread.ManagedThreadId);

            Func<string,string> func = t =>
            {
                string result = "这是我的返回值";

                for (int k = 0; k < 1000000000; k++)
                { }
                Console.WriteLine("当前参数是{1},当前线程是{0},返回的参数是 {2}", Thread.CurrentThread.ManagedThreadId,t, result);
                return result;
            };

            AsyncCallback asyncCallback = t =>
            {
                string res = func.EndInvoke(t);
                Console.WriteLine("获取到返回值:{0}", res);
            };

            func.BeginInvoke("异步参数", asyncCallback, null);


            Console.WriteLine("----------主程序结束,线程ID是{0}-----------------", Thread.CurrentThread.ManagedThreadId);

            Console.Read();
        }

转载于:https://www.cnblogs.com/yangxi1081/p/9647302.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值