WPF如何获得变量异步回调函数时产生的异步回调
有这样的问题,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);
}

这里有两点要注意:
- handler注冊的方法里不能涉及到不论什么UI控件和UI逻辑。否则异步方法没有调用完就会运行EndInvoke方法,导致调用错误
- 假设必需要用到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);
}
}
}

版权声明:本文博主原创文章,博客,未经同意不得转载。
WPF如何获得变量异步回调函数时产生的异步回调的更多相关文章
- js中的回调函数 和promise解决异步操作中的回调地狱问题。
回调函数 : 函数作为参数传递到另外一个函数中.简单数据类型和引入数据类型中的数组和对象作为参数传递大家肯定都不陌生,其实引用数据类型中的函数也是可以的. 事实上大家见到的很多,用到的也很多,比如jQ ...
- Qt 学习之路 2(19):事件的接受与忽略(当重写事件回调函数时,时刻注意是否需要通过调用父类的同名函数来确保原有实现仍能进行!有好几个例子。为什么要这么做?而不是自己去手动调用这两个函数呢?因为我们无法确认父类中的这个处理函数有没有额外的操作)
版本: 2012-09-29 2013-04-23 更新有关accept()和ignore()函数的相关内容. 2013-12-02 增加有关accept()和ignore()函数的示例. 上一章我们 ...
- js回调函数以及同步与异步
1. 背景介绍javascript的单线程特性由于javascript语言是一门“单线程”的语言,所以,javascript就像一条流水线,仅仅是一条流水线而已,要么加工,要么包装,不能同时进行多个任 ...
- JAVA回调函数ANDROID中典型的回调地方
在计算机中回调函数是指通过函数参数传递到其他代码类的,某一块可执行代码的引用,这以设计允许了底层代码调用者在高层定义的子程序. 在JAVA里面我们使用接口的方式来实现函数的回调. 回调的通俗就是:程序 ...
- C/C++ 不带参数的回调函数 与 带参数的回调函数 函数指针数组 例子
先来不带参数的回调函数例子 #include <iostream> #include <windows.h> void printFunc() { std::cout<& ...
- socket.io笔记二之事件监听回调函数接收一个客户端的回调函数
//服务端 socket.on('test', function (name, fn) { console.log(name) //输出yes fn('woot'); }); //客户端 socket ...
- jquery用Ajax中的回调函数时注意事项
前端代码 <script language="javascript" type="text/javascript" src="<?php ...
- 禁止layer.msg()回调函数时抖动
layer.msg(resp.msg, { shift: -1, time: 2000 }, function () { window.l ...
- [转]理解与使用Javascript中的回调函数
在Javascript中,函数是第一类对象,这意味着函数可以像对象一样按照第一类管理被使用.既然函数实际上是对象:它们能被“存储”在变量中,能作为函数参数被传递,能在函数中被创建,能从函数中返回. 因 ...
随机推荐
- “新浪UC”的后江湖时代------易名新浪SHOW重出江湖
说到新浪UC,相信很多老网民应该并不陌生,当年QQ放号收费让新浪UC火爆了好一阵子,而随着QQ的崛起,UC也就渐渐退出了即时通信市场,不过,这并不意味着新浪UC退出了历史舞台,因为目前炙手可热 ...
- UVA 10795 - A Different Task(递归)
A Different Task The (Three peg) Tower of Hanoi problem is a popular one in computer science. Brie ...
- MySQL 存储过程例子,不能在if else里面用begin end否则会报错Error Code : 1064!
Error Code : 1064 You have an error in your SQL syntax; check the manual that corresponds to your My ...
- SQL查询数据封装JavaBean对象
public static List getListBySql(String sql, Class cls){ List list = new ArrayList(); Connection ...
- 11gR2(11.2) RAC TAF Configuration for Admin and Policy Managed Databases (文档 ID 1312749.1)
In this Document Purpose _afrLoop=1459323732561579&id=1312749.1&displayIndex=10&_afr ...
- Swift - 炫酷放射弹出按钮菜单(改造自AwesomeMenu)
这个是一个第三方按钮菜单组件,原版是使用Objective-C编写的名为AwesomeMenu的组件,地址是:https://github.com/levey/AwesomeMenu 这里改造成了Sw ...
- Mac OS升级到Yosemite后一些问题
苹果"优山美地"採用移动设备平面风格,看起来还是相当清爽. 只是升级完还是有一些程序兼容性问题的. 1. 开发Android的程序猿们,Java se 6 须要升级到2014_00 ...
- Android Studio之同一窗口打开项目
Android Studio默认新打开的项目都是重新打开一个窗口,和原项目窗口同时存在,如果打开多个项目,则有很多窗口同时打开,怎么根据需要决定自己以何种方式打开呢? 1.设置打开新项目的方式 第一项 ...
- UVA 534 - Frogger(kruskal扩展)
UVA 534 - Frogger 题目链接 题意:给定一些点.如今要求一条路径从第一个点能跳到第二个点,而且这个路径上的最大距离是最小的 思路:利用kruskal算法,每次加最小权值的边进去,推断一 ...
- delphi 文件的读取(二进制文件和文本文件)
http://blog.csdn.net/earbao/article/details/9174033