异步委托实例,以及线程池



异步委托:

namespace 异步委托
{
    public delegate int MathDelegate(int numb1,int numb2);
    class Program
    {
        static void Main(string[] args)
        {
            /*
             所谓异步执行委托,就是单独开启一个线程来执行委托指向的方法,(最好是自己定义的委托)因为委托放到一个单独的线程中执行,所以主线程没有办法拿到起返回值。有两种方法可以解决
             *1)在主线程中阻塞执行,直到子线程中的委托执行完毕返回数据为止,在此之前,主线程后面的代码都被阻塞了,不会执行。
             *2)使用回调函数,当子线程中的委托执行完毕之后,会调用这个函数,在这个函数中可以获取到委托的返回值,这种方式不会阻塞主线程的执行,主线程在子线程中的委托执行时可以继续做别的工作。
             */

            #region 同步委托:执行委托的线程和主线程是一个线程,委托中的方法没有执行完毕,则后面的代码不会执行。
            //MathDelegate mathdel = Sum;
            //int result= mathdel(1, 2);
            //Console.WriteLine(result);
            //Console.WriteLine("这是主线程的id:{0}", Thread.CurrentThread.ManagedThreadId);
            #endregion

            #region 执行异步委托
            #region 使用线程阻塞
            //MathDelegate mathdel = Sum;
            开辟一个新的线程来执行委托mathdel
            result变量就是在主线程指向在子线程中执行的mathdel委托的一个指针
            //IAsyncResult result = mathdel.BeginInvoke(1, 2, null, null);
            阻塞当前(主)线程的执行,直到委托返回数据为止,才会执行后面的方法。
            //int numb = mathdel.EndInvoke(result);
            //Console.WriteLine("不要当我,我是不可战胜的");
            //Console.WriteLine(numb);
            //Console.WriteLine(result);
            //Console.WriteLine("这是主线程的id:{0}", Thread.CurrentThread.ManagedThreadId);
         
            #endregion

            #region 回调函数
            MathDelegate mathdel = Sum;
            //开辟一个新的线程来执行委托mathdel
            //result变量就是在主线程指向在子线程中执行的mathdel委托的一个指针
            IAsyncResult result = mathdel.BeginInvoke(1, 2, new AsyncCallback(CallBackFun), 2);
            //阻塞当前(主)线程的执行,直到委托返回数据为止,才会执行后面的方法。
            //int numb = mathdel.EndInvoke(result);
            Console.WriteLine("不要当我,我是不可战胜的");
           
            Console.WriteLine("这是主线程的id:{0}", Thread.CurrentThread.ManagedThreadId);
            #endregion
           
            #endregion

            Console.ReadKey();
        }

        static void CallBackFun(IAsyncResult result)
        {
            //result在当前线程中执行的委托,以及委托的状态等。
            AsyncResult aresult = result as AsyncResult;
            MathDelegate del = aresult.AsyncDelegate as MathDelegate;
            int numb= del.EndInvoke(aresult);
            Console.WriteLine("执行的结果为{0}",numb);
        }

        #region 同步委托用到的方法
        //static int Sum(int numb1, int numb2)
        //{
        //    Console.WriteLine("执行sum方法的线程的id为{0}", Thread.CurrentThread.ManagedThreadId);
        //    int count = 0;
        //    while (true)
        //    {
        //        count++;
        //        if (count==1000000000)
        //        {
        //            break;
        //        }
        //    }
        //    return numb1 + numb2;
        //}
        #endregion

        #region 异步委托用到的方法
        static int Sum(int numb1, int numb2)
        {
            Console.WriteLine("执行sum方法的线程的id为{0}", Thread.CurrentThread.ManagedThreadId); int count = 0;
            while (true)
            {
                count++;
                if (count == 1000000000)
                {
                    break;
                }
            }  
            return numb1 + numb2;
        }
        #endregion

    }
}

线程池:

 private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show(string.Format("主线程的id{0}",Thread.CurrentThread.ManagedThreadId));
            ThreadPool.QueueUserWorkItem(new WaitCallback(SetLabel),5);
           // this.label1.Text = "222";
        }
        private void SetLabel(object obj)
        {
            this.label1.BeginInvoke(new Action(delegate()
            {
                for (int i = 0; i < 100; i++)
                {
                    this.label1.Text = obj.ToString();
                    Thread.Sleep(50);
                }               
                MessageBox.Show(string.Format("子线程的id{0}", Thread.CurrentThread.ManagedThreadId));
            }));
        }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猿猿网页设计(yywyss365)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值