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中,函数是第一类对象,这意味着函数可以像对象一样按照第一类管理被使用.既然函数实际上是对象:它们能被“存储”在变量中,能作为函数参数被传递,能在函数中被创建,能从函数中返回. 因 ...
随机推荐
- cp命令的实现
#include <unistd.h> #include <fcntl.h> #include <stdlib.h> #define BUFFERSIZE 4096 ...
- C++晋升之std中vector的实现原理(标准模板动态库中矢量的实现原理)
我们实现的数据结构是为了解决在执行过程中动态的开辟空间使用(比如我们不停的输入,输入的多少我们不确定) 假设当你看到这篇文章的话,就当作是零食咀嚼,营养没有有BUG,能够直接看我博客中文章:CPU对内 ...
- 开发指南专题八:JEECG微云高速开发平台数据字典
开发指南专题八:JEECG微云高速开发平台数据字典的使用 1.标签中使用数据字典 数据字典为系统中可能用到的字典类型数据提供了使用的便利性和可维护性.下面拉框标签<t:dictSele ...
- String[255]在高版本Delphi里还是被解释成Byte,总体长度256,使用StrPCopy可以给Array String拷贝字符串(内含许多实验测试)
学了好多不了解的知识: procedure TForm1.Button1Click(Sender: TObject); var s1 : String; s2 : String[]; begin s1 ...
- 关于jquery文件上传插件 uploadify 3.1的使用
要使用uplaodify3.1,自然要下载相应的包,下载地址http://www.uploadify.com/download/,这里有两种包,一个是基于flash,免费的,一个是基于html5,需要 ...
- 在cocos2d-x jsb/html5中设置触摸代理的方法
和官方的说明不同,js binding的很多api和ch5版是不一样的.遇到不一样的就需要我们努力去看源码寻找了. 主要是以下几个文件 cocos2d_specifics.cpp cocos2d_sp ...
- 后缀数组--可重叠的K次最长重复子串(POJ3261)
题目:Milk Patterns #include <stdio.h> #include <string.h> #define N 1000010 int wa[N],wb[N ...
- cURL安装和使用笔记
0.前言 cURL是一个利用URL语法在命令行下工作的文件传输工具.它支持文件上传和下载,所以是综合传输工具,但习惯称cURL为下载工具.cURL还包含了用于程序开发的libcurl.cURL ...
- 高度关注!国务院对A股发出强烈信号↓
高度关注!国务院对A股发出强烈信号↓http://dwz.cn/2qHBd1郎咸平:中国股市存在一大隐疾 使其成为全球市场的一个另类!http://dwz.cn/2qHBVy一不小心,马云又完成了四场 ...
- Android本地视频播放器开发--简易播放器原型
在以前的基础上,将音视频进行合并,音频播放采用OpenSL ES,视频播放采用OpenGL ES2.0进行显示,这次的版本其中音频和视频是在同一个线程,会造成音频断断续续,后续会采用音频使用SDL,视 ...