有这样的问题,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. js中的回调函数 和promise解决异步操作中的回调地狱问题。

    回调函数 : 函数作为参数传递到另外一个函数中.简单数据类型和引入数据类型中的数组和对象作为参数传递大家肯定都不陌生,其实引用数据类型中的函数也是可以的. 事实上大家见到的很多,用到的也很多,比如jQ ...

  2. Qt 学习之路 2(19):事件的接受与忽略(当重写事件回调函数时,时刻注意是否需要通过调用父类的同名函数来确保原有实现仍能进行!有好几个例子。为什么要这么做?而不是自己去手动调用这两个函数呢?因为我们无法确认父类中的这个处理函数有没有额外的操作)

    版本: 2012-09-29 2013-04-23 更新有关accept()和ignore()函数的相关内容. 2013-12-02 增加有关accept()和ignore()函数的示例. 上一章我们 ...

  3. js回调函数以及同步与异步

    1. 背景介绍javascript的单线程特性由于javascript语言是一门“单线程”的语言,所以,javascript就像一条流水线,仅仅是一条流水线而已,要么加工,要么包装,不能同时进行多个任 ...

  4. JAVA回调函数ANDROID中典型的回调地方

    在计算机中回调函数是指通过函数参数传递到其他代码类的,某一块可执行代码的引用,这以设计允许了底层代码调用者在高层定义的子程序. 在JAVA里面我们使用接口的方式来实现函数的回调. 回调的通俗就是:程序 ...

  5. C/C++ 不带参数的回调函数 与 带参数的回调函数 函数指针数组 例子

    先来不带参数的回调函数例子 #include <iostream> #include <windows.h> void printFunc() { std::cout<& ...

  6. socket.io笔记二之事件监听回调函数接收一个客户端的回调函数

    //服务端 socket.on('test', function (name, fn) { console.log(name) //输出yes fn('woot'); }); //客户端 socket ...

  7. jquery用Ajax中的回调函数时注意事项

    前端代码 <script language="javascript" type="text/javascript" src="<?php ...

  8. 禁止layer.msg()回调函数时抖动

    layer.msg(resp.msg, { shift: -1, time: 2000 }, function () {                                window.l ...

  9. [转]理解与使用Javascript中的回调函数

    在Javascript中,函数是第一类对象,这意味着函数可以像对象一样按照第一类管理被使用.既然函数实际上是对象:它们能被“存储”在变量中,能作为函数参数被传递,能在函数中被创建,能从函数中返回. 因 ...

随机推荐

  1. PreferenceActivity使用示例

    MainActivity如下: package cn.testpreferenceactivity; import android.content.SharedPreferences; import ...

  2. 按 Eclipse 开发喜好重新布置 cocos2dx 目录层次

    [tonyfield 2013.08.29 ] 1.  Cocos2dx 库的改动 处于个人的固执,花一天时间重新布置了cocos2dx 2.1.4的目录层次,将android平台无关的代码全数裁剪, ...

  3. java(样品集成框架spring、spring mvc、spring data jpa、hibernate)

    这是你自己的参考springside集成框架的开源项目.主要的整合spring.spring mvc.spring data jpa.hibernate几个框架,对于这些框架中仍然感觉更舒适sprin ...

  4. MySQL如何修改root密码

    MySQL修改用户密码         因为长期不登录MySQL数据库,登录时经常忘记root权限密码.本文提供一个在数据库服务器上修改root密码的方法,本文撰写基础是在xp操作系统下进行. 第一步 ...

  5. 窗体透明,但窗体上的控件不透明(简单好用)good

    1.在Delphi中,设置窗体的AlphaBlend := true;AlphaBlendValue := 0-255; AlphaBlendValue越小窗体的透明度就越高.这种方法将会使窗体和窗体 ...

  6. Delphi经典网站收藏

    http://delphi.icm.edu.pl/   波兰的Delphi控件网站 http://dev.rdxx.com/Delphi/  国内的编程网站 非常全面 http://oracle.ch ...

  7. jquery clone方法

    引用自http://www.w3school.com.cn/tiy/t.asp?f=jquery_manipulation_clone <html> <head> <sc ...

  8. C++内存管理学习笔记(6)

    /****************************************************************/ /*            学习是合作和分享式的! /* Auth ...

  9. 新发现IM项目Rabbitim(使用msys或者cygwin编译安装),FileZilla(wxWidget开发)

    https://github.com/KangLin/rabbitim/blob/master/docs/INSTALL.md https://github.com/KangLin/rabbitim ...

  10. mvc action 有多种跳转

    在ASP.NET mvc下,action 有多种跳转方式: return RedirectToAction("Index");//一个参数时在本Controller下 如果Redi ...