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();
        }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM