为Windows应用创建简单的异步调用模式

简介

最近我编写了很多智能客户端应用,总结了一些能够使应用程序在后台调用Web Service时不冻结前台界面的异步调用方法。虽然当前.NET Framework本身已经提供了异步调 用的机制,但我发现在Windows应用中这一机制比较难于把握,因为这时你需要正确的控制用 户界面线程处理。

在这篇文章中,我将教给您一种在Windows应用程序中实现异步调 用Web服务的简单方法,通过这一方法,您不用再考虑后台线程与前台界面线程的交互关系了 。

服务代理

Visual Studio .NET会生成较好的Web服务代理类,通过它可以 异步的使用Web服务,但是这个代理类实现的是.NET Framework本身的异步调用机制,如上所 述,这一机制对于Windows应用来说并不十分方便。由于这个原因,我一般不直接使用生成的 代理类,而是在中间增加服务代理类。

服务代理类就是增加了额外功能的类,这些功 能可以帮助客户端程序与Web服务进行交互。服务代理类实现了许多有用的功能,包括数据缓 存,安全身份管理,离线操作支持等等。本文中创建的服务代理类比.NET Framework本身的 普通代理类实现了更简便的异步调用模式。

用户界面线程

应用程序从一个创建和 管理用户界面的线程起始,这一线程被称为用户界面线程。大多数开发者本能的会使用用户 界面线程完成所有的工作,包括进行Web服务调用,远程对象调用,访问数据库等等,大多数 使用和性能方面的问题是由这一不恰当的方法引起的。

问题的本质是你永远不可能精 确的预知访问Web服务,远程对象,或者数据库所需的时间。而且当你在用户界面线程中进行 这类的调用时,用户界面就有可能会产生令人恼怒的冻结。

自然而然的,你会把这一 类的调用放置在一个单独的线程中,但我更进了一步,建议您把所有的非用户界面工作坊制 在一个分离的线程中。我的观点是,用户界面线程只用来管理用户界面,而所有那些你不能 保证良好响应时间的对象调用都应该是异步的,无论是进程内的,跨进程的,还是跨计算机 的。

无论如何,尽量使用户界面线程处理的异步调用模式简单化,我已经实现了一个 与Visual Studio 2005里某个特性类似的简单异步调用模式。作为开始,我们首先解释一下 当前.NET Framework中异步调用模式的工作原理。

.NET异步调用模式

系统生成的 Web服务代理类的每个Web函数都有一个Begin和一个End方法,每个支持.NET Framework异步 调用模式的对象都和这个类似。开始进行异步调用时,客户端调用Begin方法时就立即响应, 或者在建立了访问Web服务的独立线程后马上响应。在这之后的某个时间,当Web服务访问完 成后,客户端再调用End方法。

但客户端如何知道什么时候调用End方法呢?Begin方 法会返回一个IAsyncResult对象,可以帮助你跟踪异步调用的过程,也可以明确的等待后台 线程完成,但如果在用户界面线程中进行这些工作,会降低整个系统的同步性。更好的方法 是,在用户界面进程中注册一个回调函数,当其它工作完成时产生一个自动通知。

让 我们看一段样例代码,在这段代码中,我们从一个Web服务中获取一些客户数据,这些功能通 过Web服务代理类里的GetCustomerData方法完成。我们可以启动这个Web服务调用,并且用以 下代码注册一个回调函数,用来在用户界面线程中产生与应用程序进行交互的功能。

private void SomeUIEvent( object sender, EventArgs e )
{
  // Create a callback delegate so we will
  // be notified when the call has completed.
  AsyncCallback callBack = new
   AsyncCallback( CustomerDataCallback );
  // Start retrieving the customer data.
  _proxy.BeginGetCustomerData( "Joe Bloggs", callBack, null );
}

时间: 2024-08-22 15:17:06

为Windows应用创建简单的异步调用模式的相关文章

Windows 8应用开发之异步调用

 不论是桌面客户端还是Web应用通常会出现处理时间较长的操作,为了在这段时间内不影响用户与应用之间的交互体验,开发人员通常会使用异步调用技术,使得比较复杂的逻辑操作由异步进行,用户仍然可以继续使用应用,不会有无响应的等待情况出现. 本篇将通过一个简单的实例演示如何在Windows 8 应用中使用异步编程.首先我们来编写一个"Get Blogs"按钮,点击它可以从Windows Blog中获取博客列表.当然获取博客信息的过程是由异步进行的,这个过程中为了测试用户仍然可以与应用交互,我们再

asp.net C# 异步调用的处理方法

A.   用回调函数(本例中为CallBackMethod),异步结束后,自动调用此回调函数.    B.   而不在主线程中手工等待异步结束,如上两例中在主线程中调用EndInvoke.此种方法,是在回调函数中调用EndInvoke的.      异步回调的大概流程是这样的:首先启动异步,启动参数加上异步结束时执行的方法,然后这个异步线程就不用管了,最后当这个异步线程自己完成工作了,就自动执行启动参数里的那个方法,这样确实很省心,可是代码写起来,就很复杂了. 一个最简单的异步调用  代码如下

使用SQL Server 2000创建临时Job异步执行SQL 脚本

server|创建|脚本|异步|执行 应用场景:    在庞大的数据库中很多复杂的更新查询非常的耗时.为了避免用户长时间的等待,那些耗时的操作可以采用异步执行的方法,立刻返回执行信息给用户,同时在数据库后台执行操作,等到执行完毕再更新数据表.    开发环境:SQL SERVER2000 .NET 解决方案:    在SQL SERVER2000中创建一个临时的Job,(或者固定的Job,根据具体的应用场景),传递需要执行的SQL batch脚本,然后启动这个Job.这样就可以在数据库获得异步调

写个JavaScript异步调用框架(Part 4

我们已经实现了一个简单的异步调用框架,然而还有一些美中不足,那就是顺序执行的异步函数需要用嵌套的方式来声明. 现实开发中,要按顺序执行一系列的同步异步操作又是很常见的.还是用百度Hi网页版中的例子,我们先要异步获取联系人列表,然后再异步获取每一个联系人的具体信息,而且后者是分页获取的,每次请求发送10个联系人的名称然后取回对应的具体信息.这就是多个需要顺序执行的异步请求. 为此,我们需要设计一种新的操作方式来优化代码可读性,让顺序异步操作代码看起来和传统的顺序同步操作代码一样优雅. 传统做法 大

使用Promise解决多层异步调用的简单学习心得_javascript技巧

前言 第一次接触到Promise这个东西,是2012年微软发布Windows8操作系统后抱着作死好奇的心态研究用html5写Metro应用的时候.当时配合html5提供的WinJS库里面的异步接口全都是Promise形式,这对那时候刚刚毕业一点javascript基础都没有的我而言简直就是天书.我当时想的是,微软又在脑洞大开的瞎捣鼓了. 结果没想到,到了2015年,Promise居然写进ES6标准里面了.而且一项调查显示,js程序员们用这玩意用的还挺high. 讽刺的是,作为早在2012年就在M

Windows 8 应用开发 - 异步调用

原文:Windows 8 应用开发 - 异步调用     不论是桌面客户端还是Web应用通常会出现处理时间较长的操作,为了在这段时间内不影响用户与应用之间的交互体验,开发人员通常会使用异步调用技术,使得比较复杂的逻辑操作由异步进行,用户仍然可以继续使用应用,不会有无响应的等待情况出现.      本篇将通过一个简单的实例演示如何在Windows 8 应用中使用异步编程.首先我们来编写一个"Get Blogs"按钮,点击它可以从Windows Blog中获取博客列表.当然获取博客信息的过

关于webservice的异步调用简单实例

web|异步 关于webservice的异步调用简单实例无论在任何情况下,被调用方的代码无论是被异步调用还是同步调用的情况下,被调用方的代码都是一样的, 下面,我们就以异步调用一个webservice 为例作说明.这是一个webservice <WebMethod(Description:="试验")> _ Public Function delCurTable(ByVal tbName As String) As Boolean Try Return True Catch

C# 2.0 匿名方法与 Windows Forms 异步调用

window|异步 C# 2.0 匿名方法大大简化了 Windows Forms 异步调用的实现,我们再也不用手工定义异步委托或者包装类了.例如,在下面的代码示例中,Form1 有一个按钮控件和一个列表控件,在按钮控件的单击事件里,我们新建一个线程,在这个线程中向列表控件添加 10 个项目: public class Form1 : System.Windows.Forms.Form{ private System.Windows.Forms.ListBox listBox1; private

windows phone异步调用api

问题描述 windows phone异步调用api 直接上代码 private void chaxunbutton1_Click(object sender, RoutedEventArgs e) { string s =textBox1.Text; HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://300report.jumpw.com/api/getrole?name=" + HttpUti