异步委托

委托实现多窗体传值

主窗体的代码:

  public partial class FrmMain : Form
    {
        //[3] 创建委托对象(委托对象能够将委托和具体方法关联)
        public ShowCounterDelegate msgSender;

        public FrmMain()
        {
            InitializeComponent();
            //创建从窗体对象
            FrmOther01 objFrm01 = new FrmOther01();
            FrmOther02 objFrm02 = new FrmOther02();
            FrmOther03 objFrm03 = new FrmOther03();

            //4.将委托变量和具体方法关联
            this.msgSender += objFrm01.Receiver;
            this.msgSender += objFrm02.Receiver;
            this.msgSender += objFrm03.Receiver;

            //显示三个从窗体
            objFrm01.Show();
            objFrm02.Show();
            objFrm03.Show();
        }
        private int counter = 0;
        /// <summary>
        /// 发消息
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnClick_Click(object sender, EventArgs e)
        {
            counter++;
            //msgSender(counter.ToString()); //5.调用委托变量传递信息
            msgSender.Invoke(counter.ToString());
        }
        /// <summary>
        /// 复位
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnReset_Click(object sender, EventArgs e)
        {
            counter = 0;
            msgSender("0");
        }
    }

    //1.声明委托
    public delegate void ShowCounterDelegate(string counter);

子窗体的代码:

  //2.根据委托定义方法(接收委托传递的信息)
        public void Receiver(string counter)
        {
            this.IblCounter.Text = counter;
        }
 //2.根据委托定义方法(接收委托传递的信息)
        public void Receiver(string counter)
        {
            this.IblCounter.Text = counter;
        }
  //2.根据委托定义方法(接收委托传递的信息)
        public void Receiver(string counter)
        {
            this.IblCounter.Text = counter;
        }

同步委托和异步委托

 public partial class FrmMain : Form
    {
        public FrmMain()
        {
            InitializeComponent();
        }

        private void btnExe1_Click(object sender, EventArgs e)
        {
            this.lblCount1.Text = ExectueTask1(10).ToString();
            this.lblCount2.Text = ExectueTask2(10).ToString();
        }

        //2.根据委托定义实现的方法
        private int ExectueTask1(int num)
        {
            System.Threading.Thread.Sleep(5000);//延迟5秒
            return num * num;
        }

        private int ExectueTask2(int num)
        {
            return num * num;
        }
        private void btnExe2_Click(object sender, EventArgs e)
        {
            MyCalculator objMyCal = ExectueTask1; //创建委托变量,代表方法1

            //通过委托异步调用方法
            //委托类型的 BeginInvoke(<输入和输出参数>,AsyncCallback callback,object asyncState)方法:异步调用的核心
            //第一个方法10,表示委托对应的实参
            //第二个参数callback:回调函数,表示异步调用后自动调用的函数
            //第三个参数asyncState,用于向回调函数提供参数信息
            //返回值 IAsyncResult-->异步操作状态接口,封住了异步执行的参数

            //异步调用任务
            IAsyncResult result = objMyCal.BeginInvoke(10,null,null);
            this.lblCount1.Text = "正在计算请稍等。。。";

            //同步执行其他任务
            this.lblCount2.Text = ExectueTask2(10).ToString();

            //获取异步执行的结果
            int res = objMyCal.EndInvoke(result);
            //委托类型的EndInvoke() 方法:借助于IAsyncResult接口对象,不断的查询异步调用是否结束
            //该方法知道异步调用的方法所有参数,所以,异步调用完毕后,取出异步调用的结果作为返回值
            this.lblCount1.Text = res.ToString();
        }

        //1.定义一个委托
        public delegate int MyCalculator(int num);
    }

异步委托:

 public partial class FrmMain : Form
    {
        public FrmMain()
        {
            InitializeComponent();
            //初始化委托变量
            this.objMyCal = new MyCalculator(ExecuteTask);

            //Lambda表达式
            //this.objMyCal = (num, ms) =>
            //    {
            //        System.Threading.Thread.Sleep(ms);
            //        return num * num;
            //    };
        }
        //1.声明一个委托  延迟的秒数
        public delegate int MyCalculator(int num, int ms); //延迟的秒数

        //2.根据委托定义方法:返回一个数的平方
        private int ExecuteTask(int num, int ms)
        {
            System.Threading.Thread.Sleep(ms);
            return num * num;
        }

        //3.创建委托变量
        MyCalculator objMyCal = null;

        //同时执行多个任务
        private void btnExec_Click(object sender, EventArgs e)
        {

            //产生10个任务
            for (int i = 1; i < 11; i++)
            {
                //开始异步执行,并封装异步函数
                objMyCal.BeginInvoke(10 * i, 1000 * i, MyCallBack, i);
                //最后一个参数i给回调函数AsyncState赋值,这个字段是object类型,如果数据很多,可以传递集合或者类和结构
            }
        }

        //5.编写回调函数
        private void MyCallBack(IAsyncResult result)
        {
          int res=  objMyCal.EndInvoke(result);

            //异步显示结果形式:第一个的计算结果:100
          Console.WriteLine("第{0}个计算结果:{1}",result.AsyncState.ToString(),res);
        }
        //异步编程总结
        //1.异步编程是建立在委托基础上的编程方法
        //2.异步调用的每个方法都是在独立的线程上执行的。因此,本质上就是一种多线程程序,也可以说是一个“简化的多线程技术”
        //3.比较适合在后台运行较为耗时间的《简单任务》,并且要求任务之间是独立的,任务中不要有直接访问可视化控件的内容。
        //4.如果后台任务要求必须按照特定顺序执行,或者访问到特定的共享资源,异步编程不太适合,而应该选择多线程开发技术
    }
时间: 2024-10-20 08:50:24

异步委托的相关文章

异步委托(APM)使用Func异步操作,处理耗时操作

使用委托进行异步操作,处理一些耗时操作,防止主线程阻塞 使用例子: 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace Demo 7 { 8 class Program 9 { 10 11 static void Main(string[] args) 12 { 13 Func<string> fun = new Func<s

C#基础之--线程、任务和同步:一、异步委托

创建线程的一种简单方式是定义一个委托,并异步调用它.委托是方法的类型安全的引用. Delegate还支持异步地调用方法.在后台Delegate类会创建一个执行任务的线程. 为了说明委托的异步特性,从一个需要一定的时间才能执行完毕的方法开始. TakesAWhile方法至少需要经过第2个变量传递的毫秒数才能执行完,因 为它调用了Thread.Sleep()方法. static int TakesAWhile(int data, int ms) { Console.WriteLine("TakesA

C#: 异步委托

http://www.cnblogs.com/yingzhongwen/p/4568350.html 讲了委托与事件,但是对异步委托研究得还不够深入. http://www.cnblogs.com/lxblog/archive/2012/12/11/2813893.html http://www.cnblogs.com/IAmBetter/archive/2012/02/13/2348912.html http://blog.csdn.net/lexiaoyao20/article/detail

C#固定时间执行指定事件(观察者模式+异步委托)

最近有个项目需要每天固定的时间去执行指定的事件,发现网上关于这样的文章比较少,而且比较散.通过学习了几篇文章后终于实现了这个功能,在此也特别感谢这些文章的作者们,这也是我第一次在园子里面发文章,望多指教. 关于观察者模式,我在这里就不做讲解了,如有不懂,可以参考相关文章. 那么开始入正题. 主要有三个页面:Observer.cs(观察者).Subject.cs(通知者).Form1.cs Observer.cs class Observer { /// <summary> /// 执行事件A

使用异步委托执行线程(delegate)

由于异步委托产生的线程与应用程序主线程是分开执行的,若主线程要获取异步委托线程的结果,则主线程需要等待异步委托的执行结果. BeginInvoke是Delegate类型的一个方法,它的返回类型为IAsyncResult,通过该接口,可以获得异步委托的执行信息. 1.投票技术:等待异步委托结果的一种方法是投票技术,该技术的实现原理是通过IAsyncResult接口的IsComplete属性来检查委托是否完成了任务.EndInvote方法获取执行结果.举个例子,如下: 执行后的效果: 2.访问等待句

C# 多线程操作之异步委托

标签: 多线程任务nullstringhtml工作 2012-06-29 23:00 1276人阅读 评论(0) 收藏 举报  分类: C/C++/C#/dotnet(126)  目录(?)[+] 在应届生找工作的时候,多线程操作几乎是所有的公司都会问及的一个基本问题. 这里做了一个多线程操作的总结,这里总结了通过异步委托来实现多线程操作. 定义一个委托,是创建一个线程的最简单的方法,并且异步调用它.委托是方法的类型安全的引用.同时委托还智齿异步调用方法. 委托使用线程池来完成异步任务. 当自己

委托、泛型委托、异步委托(新人,有问题请指出,有部分代码是拿其他博客主的)

委托 是把一个方法当作一个参数放到声明(deletgate)委托中.给另一个方法时候,或者直接执行委托. 1 class Delegates 2 { 3 public delegate void mydelegate(string msg); 4 static void Main(string[] args) 5 { 6 mydelegate myd = new mydelegate(father.BuyToys); 7 myd("BBB"); 8 Console.Read(); 9

.NET委托解析(异步委托)

上一篇我们了解到了,委托的基本感念,列举了几个委托的实例,并根据实例来反编译源码查看.NET 委托的内部实现,从浅入深的角度来详细的去解析委托的实质,本文将系上篇继续讨论异步委托的实现以及异步委托的源码解析. 首先本文只会从委托的层面的去编写,不会涉及到深层次的异步.(后续的系列中将会对异步进行深入讲解.敬请关注.). 委托的异步调用方式 在上一篇中我们在实例中是直接通过委托对象的,例如: private static void Main(string[] args)  {        Pro

c#并行任务多种优化方案分享(异步委托)

遇到一个多线程任务优化的问题,现在解决了,分享如下. 假设有四个任务: 任务1:登陆验证(CheckUser) 任务2:验证成功后从Web服务获取数据(GetDataFromWeb) 任务3:验证成功后从数据库获取数据(GetDatFromDb) 任务4:使用2.3的数据执行一个方法 (StartProcess) 一个比较笨的方法(本人最开始的方法,记为方法1)是直接开启一个线程,按照顺序依次执行四个任务: new Thread(delegate                {