zoukankan      html  css  js  c++  java
  • 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();
            }
  • 相关阅读:
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    svn 启动项目报错,项目被lock
    BigDecimal 用法详解
    MySQL 规范
    Tomcat 详解URL请求
    Tomcat Servlet工作原理
    Tomcat Context容器和Wrapper容器
    Tomcat 核心组件 Container容器相关
    Tomcat 核心组件 Connector
  • 原文地址:https://www.cnblogs.com/yangxi1081/p/9647302.html
Copyright © 2011-2022 走看看