1.流程:
  1.1 定义一个委托,形如:public delegate object WorkThread(object controlsAndParameters);由于object可以容纳任何.Net类型,当然可以传入一个object数组,这样就可以传入任意多的主线程控件对象和工作者线程需要的参数对象,同时返回值也是object,故主次线程的对象可以实现某种意义上的共享
  1.2 实现工作者线程承载的函数,如:object DoSomething(object controlsAndParameters);形式与1.1中的委托一致。在此函数中可以动态控制传入的控件对象,表明此线程的执行状态。
  1.3 主线程中声明委托实例,WorkThread wh = new WorkThread(DoSomething);
  1.4 异步调用,开启工作者线程,IAsyncResult iar = wh.BeginInvoke(controlsAndParameters,new AsyncCallback(DoComplete),controls);
  1.5 实现异步调用结束函数:void DoComplete(IAsyncResult);将1.4中的放回值iar传入,而iar实际上是System.Runtime.Remoting.Messaaging空间中AsyncResult类的实例,AsyncResult类有两个重要的属性:(1)AsyncDelegate:指向原始委托的引用,即wh;(2)AsyncState:指向BeginInvoke中的最后一个传入参数,即controls;由(1)得到原始委托,并调用EndInvoke()得到DoSomething的返回值,由(2)可在异步调用结束时对界面 进行适当的控制。

2.缺点:

  2.1 由于DoSomething()和DoComplete()都是在工作者线程中执行,所以按上述形式,最终工作者线程的执行结果是在工作者自己处理的,如果主线程要得到执行结果,就必须自己轮询判断工作者线程是否执行结束,非常不方便。

  

参考:《C#与.NET 4高级程序设计 (第5版) 》

转载于:https://www.cnblogs.com/lihaoran/archive/2012/02/12/2347715.html

界面-工作者线程结构之:异步委托调用相关推荐

  1. .NET简谈组件程序设计之(异步委托)

    说到委托我想大家基本上都用过的,今天这篇文章就来讲解关于委托的异步奥秘. 在我们正常使用的时候很少会去用异步委托技术来提高代码效率.委托的好处就是能对方法进行面向对象的封装,随意传递.在任何组件客户代 ...

  2. [转载]C#异步委托的用法 .

    每个委托都有三个方法:Invoke.BeginInvoke.EndInvoke.第一个方法是委托指定函数的同步调用,另外两个是异步调用. BeginInvoke方法,调用后立即返回,不等待调用结果.E ...

  3. 多线程,异步委托,同步委托几种方式的区别

    Code         public delegate void DoThingsDelegate();         private void Window_Loaded(object send ...

  4. [转摘]使用异步方式调用同步方法

    使用异步方式调用同步方法 .NET Framework 4.5 .NET Framework 4 Visual Studio 2008 .NET Framework 3.5 .NET Framewor ...

  5. C# 异步委托 BeginInvoke EndInvoke

    1. 简单主线程中委托: static void Main(string[] args) {//定义一个委托,并初始化Func<int, int, string> delFunc = (a ...

  6. 异步委托实现多线程winform控件编程

            private void button1_Click(object sender, EventArgs e)         {             ThreadStart ts  ...

  7. ExtJs异步ajax调用和同步ajax调用公用方法

    Js代码 //异步ajax调用 /** * 异步调用ajax,成功后返回值,作为回调函数的参数 调用失败会提示 * * @param {} *            urlStr * @param { ...

  8. 委托声明----委托实例化-----委托调用

    定义和使用委托分三个步骤: 1.委托声明.2.委托实例化.3.委托调用. 一.定义委托 定义委托的语法如下: <访问修饰符> delegate 返回类型 委托名(); 定义委托和定义方法很 ...

  9. BeetleX之XRPC远程委托调用

    BeetleX.XRPC是基于接口的远程通讯组件,它不仅可以把接口提供客户端调用,同样也支持服务端创建客户端的接口实例并主动调用客户端的方法.接口有着非常的规范性和约束性,但前提你是必须制定相应的接口 ...

最新文章

  1. iOS 之 UICollectionView
  2. 牛客算法周周练2 B Music Problem(DP,抽屉原理,二进制拆分)
  3. 前端基础-jQuery的事件的用法
  4. 小微商户申请php,微信小微商户申请入驻 - osc_r8q2esik的个人空间 - OSCHINA - 中文开源技术交流社区...
  5. linux 硬软链接区别
  6. uva 1476 - Error Curves
  7. Filter与Servlet的区别和联系
  8. python实现qq登录界面_使用Python编写一个QQ办公版的图形登录界面!
  9. I—爆炸的符卡洋洋洒洒(不模不行的DP)
  10. 超越cookie - 使用DOM sessionStorage和localStorage来保存更多信
  11. 线性系统的Matlab分析函数
  12. 打造基金经理能力圈 基金公司探索投资风格细化
  13. linux安装软件的方式
  14. 电子邮件地址怎么写?
  15. 剖析 OceanConnect 物联网特性
  16. RouterOS 通过NTH/PCC设置多线负载均衡及带宽叠加
  17. 如果你觉得累,这三个“高内耗”行为,一定要戒掉!
  18. 如何获取对方精确位置
  19. c语言课程设计查找分数与删除元素,c语言课程设计学生成绩管理系统
  20. Struts原理与实践

热门文章

  1. WebGIS空间数据请求访问机制
  2. device not ready cuda
  3. mac 下搭建 php + apache + mysql 服务器(cool)
  4. 如何弄一个IPHONE 添加到桌面的图标
  5. C语言-人狼羊菜问题-最容易看懂的解决方法及代码
  6. Ubuntu x64安装Android studio 全部步骤和问题解决
  7. python使用退格键时出现^H解决方法
  8. 异常处理:Mybatis报错:There is no getter for property named ‘xxxx‘ in ‘class xxx‘
  9. 解决python中文乱码的方法
  10. 解决mysql“Access denied for user‘root‘@‘IP地址‘“问题