有这样的问题,WPF当使用异步回调,需要使用产生的异步变量中的回调函数。数据库中查询诸如异步函数来获得一DataTable。怎样传递给回调函数呢?

【方案一】使用全局变量

  非常easy想到的是用全局变量。这也是最简单的办法。可是假设我想循环调用呢,比如回调函数推断异步函数运行完之后的DataTable有没有数据,有数据则继续异步(BeginInvoke),这时候假设使用全局变量可能会出现意外情况,由于是循环调用,回调函数使用的DataTable是不是你想要的那个值就比較难说了。

【方案二】闭包

  这也是一个比較常规的办法,闭包的话就方便内部变量传递了,写法例如以下:

private void QueryDateBase(){DataTable dtTarget = new DataTable();//共享变量
Action handler = delegate()//异步匿名托付
            {dtTarget = XXX查询数据库;};AsyncCallback functionCallBack = delegate(IAsyncResult asyResult)//回调匿名托付
            {handler.EndInvoke(asyResult);if (dtTarget.Rows.Count > 0){QueryDateBase();}};handler.BeginInvoke(functionCallBack, null);}

  这就是所谓的闭包了,使用了匿名托付,回调函数和异步函数定义在一个方法体内。这样变量就能共享,类似的。WPF的动画有个Completed事件,假设它里面要使用到開始运行时的一些变量,也能使用此法共享变量。这里有两点要注意:
  1. handler注冊的方法里不能涉及到不论什么UI控件和UI逻辑。否则异步方法没有调用完就会运行EndInvoke方法,导致调用错误
  2. 假设必需要用到UI控件或者UI逻辑,能够用Application.Current.Dispatcher.Invoke(new Action(() => { ...}));

  那么,能不能不使用全局变量呢?

【方案三】使用返回值

  使用带返回值的托付。这样在托付EndInvoke的时候就能够获得托付的返回值了,代码看起来是这种:

    public class Student{public Func<DataTable> queryHandler;public Student(){queryHandler = QueryDateBase;queryHandler.BeginInvoke(CallBack, null);}private DataTable QueryDateBase(){DataTable dtTarget = XXX查数据库;return dtTarget;}private void CallBack(IAsyncResult ar){DataTable dtCallBack = queryHandler.EndInvoke(ar);if (dtCallBack.Rows.Count > 0){queryHandler.BeginInvoke(CallBack, null);}}}

  个人觉得这是比較正统的写法。精准的返回值,没有全局变量。事实上Winform也是如此,使用起来并无差异。仅仅是wpf涉及UI时要注意。

版权声明:本文博主原创文章,博客,未经同意不得转载。

WPF如何获得变量异步回调函数时产生的异步回调相关推荐

  1. 什么是回调函数?为什么要使用回调函数?如何使用回调函数?

    1. 什么是回调函数: 函数指针的调用,即是一个通过函数指针调用的函数: 如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,就说这是回调函数. In compu ...

  2. php回调函数的作用域,PHP将回调函数作用到给定数组单元的方法

    PHP将回调函数作用到给定数组单元的方法 数组是PHP程序设计中十分重要的一环.本文介绍PHP中数组函数array_map()的用法,实现将回调函数作用到给定数组单元上.具体如下: array arr ...

  3. python回调函数实例详解_Python回调函数用法实例详解

    本文实例讲述了Python回调函数用法.分享给大家供大家参考.具体分析如下: 一.百度百科上对回调函数的解释: 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函 ...

  4. ajax 成功回调函数,jQuery的阿贾克斯成功回调函数定义jQuery的阿贾克斯成功回调函数定义(jQuery ajax...

    我想使用jQuery的ajax从服务器获取数据. 我希望把成功的回调函数定义外面.ajax()块像下面这样. 所以,我需要声明变量dataFromServer像下面这样我就能从成功回调使用返回的数据? ...

  5. java回调函数的生命_Java的回调函数 - choaklin 的个人空间 - OSCHINA - 中文开源技术交流社区...

    暂且不提回调函数的各种定义,如我本人,虽然知道JavaScript的回调的使用,但是百科了回调的定义,还是觉得云里来雾里去.所以大可先从已熟悉的入手,旁推侧引它的原理,再引出Java版的实现. 因为博 ...

  6. linux线程切换回调函数,linux C线程退出回调函数

    待补充.................... 函数原型 void pthread_cleanup_push(void (*routine)(void*), void *arg); void pthr ...

  7. C语言 信号集回调函数 避免子进程在信号回调注册完成之前全部结束

    // ..使用内存映射可以拷贝文件 /* 对原始文件进行内存映射 创建一个新文件 把新文件的数据拷贝映射到内存中 通过内存拷贝将第一个文件的内存映射区拷贝到第二个文件的内存映射区 释放资源 */// ...

  8. python 匿名回调函数_Python面试题之回调函数

    编程分为两类:系统编程(system programming)和应用编程(application programming).所谓系统编程,简单来说,就是编写库:而应用编程就是利用写好的各种库来编写具某 ...

  9. C语言之回调函数(非常重要)附带回调函数版本实现整型的加减乘除四则运算

    对于回调函数!想必大家的第一想法,想必就是函数吧!其实这个也是笔者的第一想法,毕竟之前没有见过回调函数,所以就不怎么知道细节!默认为直接调用函数,就是回调函数,但等学会了回调函数,其实就不是这样想了! ...

最新文章

  1. 批量导入导出站点权限site permissions
  2. 电脑开机一会就蓝屏怎么回事_客户电脑老是出现问题,三天来找三次麻烦!拆机后“真凶”大白!...
  3. 来,看看这20个常用的宏定义!
  4. java课程课后作业04之动手动脑
  5. 辉光UIView的category
  6. 多步注册页面html模板,PHP HTML多步骤页面_php_开发99编程知识库
  7. flowable 表名sql mysql和oracle
  8. ASP.NET MVC 解析模板生成静态页一(RazorEngine)
  9. 强大的 actuator 服务监控与管理
  10. 计算机软件国民经济行业代码,国民经济行业类别及代码.DOC
  11. 机器人控制算法----模糊控制
  12. java劳务派遣信息管理系统servlet员工社保工资信息jsp源码mysql
  13. 【首发】 ubuntu20.04安装matlab2021b/matlab2020b
  14. C语言 推箱子游戏 地图编辑器(简单)
  15. 微信应用架构!!-----微信应用的测试管理篇
  16. ccna综合实验实训总结_CCNA实训总结
  17. .vm后缀的文件是什么?
  18. 微信小程序 -- 订阅消息wx.requestSubscribeMessage
  19. airpak模拟案例,Airpak模拟教程-体育馆通风模拟案例-CFD数值模拟教程airpak.pdf
  20. 竞价推广排名与自然排名的优缺点?

热门文章

  1. java虚拟机内存监控_java虚拟机内存监控工具
  2. java版msn_强!Java实现MSN Messenger聊天
  3. qt调用linux 进程,Linux 下qt 程序打包发布(使用linuxdelpoyqt ,shell 脚本)
  4. android运用 sqlite 实现简单的通讯录_大一新生作品:利用 C 语言实现quot;通讯录管理系统quot;,直言太简单...
  5. 测量场效应晶体管(JFET) 2N3819
  6. 智能车竞赛技术报告 | 单车拉力组 - 沈阳航空航天大学 - 青梅绿茶队
  7. 西安交通大学计算机科学与技术学科评估,西安交通大学学科评估排名!附西安交大a类学科名单...
  8. python多线程没用_python的多线程到底有没有用?
  9. html调用相机相册案例,Ionic 相册、相机调用
  10. python书籍_python书籍