C#异步编程的使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wuguanghao/article/details/77127479

C#有同步编程和异步编程,
同步编程:比如一个方法中有多个任务同时在执行,那么这个时候,必须等待所有的任务都执行完毕后,系统界面才继续响应。
异步编程:多个任务同时执行时,首先执行的任务可以先显示执行结果,后执行完的在后台继续运行,等待运算完成才显示结果。

下面实例中我们采用的方法就是使用异步编程的方式,首先异步编程时建立在委托的基础之上的编程方法,异步调用的每一个方法都是在独立的线程中执行。异步编程本质就是多线程的程序,它比较适合在后台运行,各个任务之间独立,任务中不要有直接的访问控件。多线程Thread代表的就是托管线程,通常我们将线程设置为后台程序,thread1.isbackground=true;
C#的编写的程序都是托管程序,基于win 32开发的程序为非托管程序,托管程序可以调用非托管程序,非托管程序不可以调用托管程序。

如果要按照特定的执行顺序执行,或者访问共享资源,那么异步编程就不是那么合适,最好选择多线程编程,因为多线程的编程更容易控制线程的优先级,控制线程的启动停止。
异步编程适合与比较简单的比较耗费时间的形式。

//声明一个委托
public delegate int MyCalcul(int m);
//声明一个委托对象
public MyCalcul objMyCalcul;
  private void button1_Click(object sender, EventArgs e)
        {
            label2.Text = "111111";//此时label2标签的结果会提前显示,虽然此时label1还没有执行完毕
            objMyCalcul = new MyCalcul(Method);
            for (int i = 1; i < 11;i++ )
            {
                //开启异步委托的方式,这里有调用回调函数,当调用的方法执行完毕后,会立即调用回调函数
                //并返回一个IAsyncResult的接口对象,数据都保存在这个接口对象中,
                objMyCalcul.BeginInvoke(10*i, mycallback, i);
            }
        }
        //委托将要调用的方法
        private int Method(int m)
        {
            Thread.Sleep(1000);
            return m * m;
        }
        private void mycallback(IAsyncResult result)
        {
            //结束Invoke之后,可以通过这个接口对象返回测试结果
            int res = objMyCalcul.EndInvoke(result);
            Console.WriteLine("第{0}个结果为:{1}", result.AsyncState.ToString(), res.ToString());
        }
    }

另外在调试的过程如果需要打印显示结果的时候,即使是使用的Window窗体应用程序,可以先更改为控制台应用程序,这样就可以将信息打印出来。如下图:
窗体+控制台界面

猜你喜欢

转载自blog.csdn.net/wuguanghao/article/details/77127479