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

3 篇文章 0 订阅

同步执行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结果:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值