zoukankan      html  css  js  c++  java
  • 异步-学习笔记2

    1. 异步的回调和状态参数
    2. 异步等待
    3. 获取异步的返回值

            private void AsynicAdvanced_Click(object sender, EventArgs e)
            {
                Console.WriteLine("****************AsynicAdvancedButton_Click Begin******************");
                {
                    string threadname = string.Format("OneThread");
                    Action<string> threadDelegate = UseTimeMethod; //委托是异步多线程的基础
    
                    // BeginInvoke的倒数第二个参数是回调参数,这个参数是AsyncCallback类型,该类型是一个委托:
                    // public delegate void AsyncCallback(IAsyncResult ar)
                    // BeginInvoke完成后会返回一个IAsyncResult类型的结果,这个结果又作为回调方法的参数
                    // 回调的作用就是:异步结束后你想做的操作
                    IAsyncResult Iresult = null;
                    AsyncCallback callback = t =>
                    {
                        Console.WriteLine("BeginInvoke的状态值是{0}", t.AsyncState); //这个是状态参数,object类型,这里简单的传了一个string类型
                        Console.WriteLine("BeginInvoke是否完成:{0} ", t.IsCompleted); //这个表示异步操作是否完成
                        Console.WriteLine("回调参数的类型是否等同于Iresult:{0}", t.Equals(Iresult)); // IAsyncResult是beginInvoke异步执行返回值的类型
                        Console.WriteLine("这是异步回调");
                    };
                    Iresult = threadDelegate.BeginInvoke(threadname, callback, "yoyo");
    
                    // 现在希望异步执行完后再执行之后的语句。有两种方式:
                    // 1. 做一个进度条
                    // 2. EndInvoke()
    
                    //进度条
                    while (!Iresult.IsCompleted) //异步没完成,执行循环
                    {
                        for (int i = 1; i < 10; i++)
                        {
                            Console.WriteLine("异步线程以完成了{0}%", i * 10);
                            Thread.Sleep(300); //进度条基本都是假的,因为在前一节课算过一个异步完成大概是3秒
                        }
                    }
    
                    // 用EndInvoke();
                    threadDelegate.EndInvoke(Iresult); // EndInvoke需要一个参数,这个参数就是BeginInvoke的返回值
                }
    
                //如果异步要完成的方法是带返回值的,需要怎么显示这个返回值,先创建一个带返回值的方法
                {
                    Func<string, int> ThreadDelegate = WithReturnUseTimeMethod;
                    IAsyncResult Iresult = null;
                    Iresult = ThreadDelegate.BeginInvoke("AsyncThread", null, null);
                    int Asyncresult = 0;
                    Asyncresult =ThreadDelegate.EndInvoke(Iresult); //这个结果就是异步调用方法的返回值
                    Console.WriteLine("异步调用方法的返回值为{0}", Asyncresult);
                }
                Console.WriteLine("****************AsynicAdvancedButton_Click End********************");
            }
    
            //定义一个耗时的方法
            public void UseTimeMethod(string threadname)//不带返回值
            {
                Console.WriteLine("{0}   {1}  start ,线程id={2}", DateTime.Now.ToString("yyyy-MM-dd-hh-mm-ss.fff"), threadname, Thread.CurrentThread.ManagedThreadId);
                int icount = 0;
                for (int i = 0; i < 1000000000; i++)
                {
                    icount = i;
                }
                Console.WriteLine("{0}   {1}  end   ,线程id={2},Result={3}", DateTime.Now.ToString("yyyy-MM-dd-hh-mm-ss.fff"), threadname, Thread.CurrentThread.ManagedThreadId, icount);
            }
    
            public int WithReturnUseTimeMethod(string threadname)//带返回值
            {
                Console.WriteLine("{0}   {1}  start ,线程id={2}", DateTime.Now.ToString("yyyy-MM-dd-hh-mm-ss.fff"), threadname, Thread.CurrentThread.ManagedThreadId);
                int icount = 0;
                for (int i = 0; i < 1000000000; i++)
                {
                    icount = i;
                }
                Console.WriteLine("{0}   {1}  end   ,线程id={2},Result={3}", DateTime.Now.ToString("yyyy-MM-dd-hh-mm-ss.fff"), threadname, Thread.CurrentThread.ManagedThreadId, icount);
                return icount;
            }

     结果

  • 相关阅读:
    toj 2975 Encription
    poj 1797 Heavy Transportation
    toj 2971 Rotating Numbers
    zoj 2281 Way to Freedom
    toj 2483 Nasty Hacks
    toj 2972 MOVING DHAKA
    toj 2696 Collecting Beepers
    toj 2970 Hackle Number
    toj 2485 Card Tric
    js页面定位,相关几个属性
  • 原文地址:https://www.cnblogs.com/xiao9426926/p/6101430.html
Copyright © 2011-2022 走看看