C#/.Net 同步异步【一】

同步执行5次 循环1亿次方法    对比委托异步执行5次 循环1亿次方法

 private void Test(string name)
        {
            Console.WriteLine($"---------------{name}--------------{Thread.CurrentThread.ManagedThreadId.ToString()}---{DateTime.Now.ToString("yyyy-MM-dd HH:mm;ss;fff")}----------------------");
            int j = 0;
            for (int i = 0; i < 1_000_000_000; i++)
            {
                j++;
            }
          
        }

1、同步方法:

        /// <summary>
        /// 同步
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            Console.WriteLine($"----------------同步---------------{Thread.CurrentThread.ManagedThreadId.ToString()}---{DateTime.Now.ToString("yyyy-MM-dd HH:mm;ss;fff")}-----------开始-----------");
          
            for (int i = 0; i < 5; i++)
            {
               this.Test(string.Format($"Test_{i}"));
            }
            Console.WriteLine($"----------------同步---------------{Thread.CurrentThread.ManagedThreadId.ToString()}---{DateTime.Now.ToString("yyyy-MM-dd HH:mm;ss;fff")}-----------结束-----------");
        }

2、异步方法:

        /// <summary>
        /// 异步多线程
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button2_Click(object sender, EventArgs e)
        {
            Console.WriteLine("------------------------------------");
            Console.WriteLine($"----------------异步---------------{Thread.CurrentThread.ManagedThreadId.ToString()}---{DateTime.Now.ToString("yyyy-MM-dd HH:mm;ss;fff")}-----------开始-----------");
            Action<string> action = this.Test;
            for (int i = 0; i < 5; i++)
            {
                string name = string.Format($"Test_{i}");
                action.BeginInvoke(name, null, null);
            }
            Console.WriteLine($"----------------异步---------------{Thread.CurrentThread.ManagedThreadId.ToString()}---{DateTime.Now.ToString("yyyy-MM-dd HH:mm;ss;fff")}-----------结束-----------");
        }

1&2执行结果:

3、异步完成调用后调用方法:AsyncCallback

        /// <summary>
        /// 异步
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button2_Click(object sender, EventArgs e)
        {
            Console.WriteLine("------------------------------------");
            Console.WriteLine($"----------------异步---------------{Thread.CurrentThread.ManagedThreadId.ToString()}---{DateTime.Now.ToString("yyyy-MM-dd HH:mm;ss;fff")}-----------开始-----------");
            Action<string> action = this.Test;
            AsyncCallback callback = ar => Console.WriteLine("完成计算");
            string name = string.Format($"Test_1");
            action.BeginInvoke(name, callback, null);

            Console.WriteLine($"----------------异步---------------{Thread.CurrentThread.ManagedThreadId.ToString()}---{DateTime.Now.ToString("yyyy-MM-dd HH:mm;ss;fff")}-----------结束-----------");
        }

3结果

4、异步回调

 /// <summary>
        /// 异步回调
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button2_Click(object sender, EventArgs e)
        {
            Console.WriteLine("------------------------------------");
            Console.WriteLine($"----------------异步---------------{Thread.CurrentThread.ManagedThreadId.ToString()}---{DateTime.Now.ToString("yyyy-MM-dd HH:mm;ss;fff")}-----------开始-----------");
            Action<string> action = this.Test;
            AsyncCallback callback = ar =>
            {
                Console.WriteLine($"计算完成。{ar.AsyncState}---{Thread.CurrentThread.ManagedThreadId.ToString()}");
            };
            string name = string.Format($"Test_1");
            action.BeginInvoke(name, callback, "回去");

            Console.WriteLine($"----------------异步---------------{Thread.CurrentThread.ManagedThreadId.ToString()}---{DateTime.Now.ToString("yyyy-MM-dd HH:mm;ss;fff")}-----------结束-----------");
        }

4结果:

5、判断异步是否完成 IsCompleted

         /// <summary>
        /// 异步回调
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button2_Click(object sender, EventArgs e)
        {
            Console.WriteLine("------------------------------------");
            Console.WriteLine($"----------------异步---------------{Thread.CurrentThread.ManagedThreadId.ToString()}---{DateTime.Now.ToString("yyyy-MM-dd HH:mm;ss;fff")}-----------开始-----------");
            Action<string> action = this.Test;
            IAsyncResult asyncResult = null;
            // asyncResult.AsyncWaitHandle.WaitOne();//等到任务完成
            AsyncCallback callback = ar =>
            {
                Console.WriteLine($"计算完成。{ar.AsyncState}---{Thread.CurrentThread.ManagedThreadId.ToString()}");
            };
            string name = string.Format($"Test_1");
            asyncResult=action.BeginInvoke(name, callback, "回去");
            int i = 0;
            while (!asyncResult.IsCompleted)
            {
              
                if (i < 9) {
                    Console.WriteLine($"已完成{++i*10}%.....");
                }
                else
                {
                    Console.WriteLine($"已完成99.999999%.....");
                }
                Thread.Sleep(200);
            }
            Console.WriteLine("全部完成");
            Console.WriteLine($"----------------异步---------------{Thread.CurrentThread.ManagedThreadId.ToString()}---{DateTime.Now.ToString("yyyy-MM-dd HH:mm;ss;fff")}-----------结束-----------");
        }

5结果:

发布了4 篇原创文章 · 获赞 5 · 访问量 3227

猜你喜欢

转载自blog.csdn.net/qq_42245621/article/details/105139927