- 热门文章:
- · .NET Framework中使用XML Web Service(1)
- · 管理三元式的新思路,涉及到查询时似乎可以借用Social Network的思想
- · 使用AOP微型框架的例子
- · VB.NET中使用FTP下载文件的两种方法
- · .net下基于API封装的DirectUIHWND窗体访问
- · 在.net中调用存储过程的另一种方法
- · .NET Remoting 实现分布式数据库查询
- · 使用CodeDom开发基于B/S的.NET+MSSQL代码生成器的随感
- · 利用.NET的Reflection增强对象工厂的扩展性
- · .NET框架中基于角色的安全性(3)
- · .NET框架中基于角色的安全性(2)
- · .NET框架中基于角色的安全性(1)
.NET Framework中使用XML Web Service(2)
异步调用 XML Web Service 分两个步骤。第一步,调用 Begin 方法以初始化 Web 方法调用。第二步,调用 End 方法以完成 XML Web Service 调用并检索 XML Web Service 的响应。
Begin 方法返回一个 System.Web.Services.Protocol.WebClientAsyncResult 对象,用于实现 System.IAsyncResult 接口。此对象提供关于待定异步调用的状态信息。通过将此对象传递给 End 方法,代理类可以标识要完成的请求,尤其是同时生成多个异步调用时。
有多种方法可以确定异步 XML Web Service 调用何时完成:
- 向 Begin 方法传递一个回调委托。回调委托将在 XML Web Service 调用完成后执行。
- 使用 IAsyncResult.AsyncWaitHandle 对象的 WaitHandle 方法之一强制应用程序等待。使用 WaitHandle 类的方法时,客户端也可以指定超时,超时过后,客户端将不再等待调用的 XML Web Service 的结果。
- 在主线程代码中轮询 IAsyncResult.IsCompleted 属性的值以查找值 true。如果此属性为 true,则调用 End 方法以检索 XML Web Service 的响应。
- 可直接调用 End 方法,而无需使用其他技术确定异步 XML Web Service 调用是否完成。此方法将中断调用线程的执行,直到异步调用完成为止。
最有效的方法是向 Begin 方法传递一个回调委托,因为回调函数在等待响应期间不会中断线程。XML Web Service 返回其响应时,回调委托将在新线程中执行。然后,在回调中调用 End 方法。
以下代码演示了如何创建异步 XML Web Service 调用;此代码显示了对 BeginGetItems 的调用,语法如下:
BeginGetItems(System.AsyncCallback callback, object asyncState);BeginGetItems 使用两个参数,第一个是 AsyncCallback 对象,它是通过在构造函数内传递 ServiceCallback 方法的地址创建的。第二个参数是对象类型的参数,可以传递任何可帮助您处理 XML Web Service 响应的对象。可以通过获取回调方法中 IAsyncResult 参数的 AsyncState 属性来访问此同一对象。在以下示例中,以这种方式传递的对象是 XML Web Service 代理对象,因此在执行回调委托时,可以调用 EndGetItems,如下面的 ServiceCallback 方法所示。
private void button2_Click(object sender, System.EventArgs e) { // 禁用 Async 按钮并清除任何数据的 ListView // 创建 XML Web Service 代理类的实例 BookCatalog.Service1 ws = new BookCatalog.Service1(); // 创建对回调委托的引用 AsyncCallback cb = new AsyncCallback(ServiceCallback); // 调用 Begin 方法,将回调委托和 // 此代理类实例作为 AsyncState 对象传递。 ws.BeginGetItems(cb,ws); } private void ServiceCallback(IAsyncResult ar) { // 将 AsyncState 对象转换为代理对象 BookCatalog.Service1 ws = (BookCatalog.Service1)ar.AsyncState; // 调用 End 方法并将响应指定给 DataSet DataSet ds = ws.EndGetItems(ar); // 遍历 DataSet 并将每个行的 Title_ID 和 Title 字段 // 添加至 ListView foreach(DataRow drBook in ds.Tables[0].Rows) { // 创建一个新 ListViewItem 添加到 ListView ListViewItem book = new ListViewItem(); // 将 Title_ID 字段指定给 Text 属性 book.Text = drBook["Title_ID"].ToString(); // 将 Title 字段指定给第一个 SubItem book.SubItem[0].Text = drBook["Title"].ToString(); // 将书 ListViewItem 添加到 ListView listView1.Items.Add(book); } }尽管生成异步 XML Web Service 调用比生成同步调用所需的代码稍多,但最终结果可以生成响应更快的应用程序,因此还是值得的。
重要信息:异步调用 XML Web Service 时,请使用多线程编程技术。生成异步 XML Web Service 调用时,如果不使用多线程技术,则在两个或多个线程同时尝试访问同一数据时,将会出现问题。技术之一(如以下代码所示)就是在 C# 中使用 lock 语句来获取对对象的相互独占的访问权,以拒绝其他线程的访问。
private void ServiceCallback(IAsyncResult ar) { // 将 AsyncState 对象转换为代理对象 BookCatalog.Service1 ws = (BookCatalog.Service1)ar.AsyncState; // 调用 End 方法并将响应指定给 DataSet DataSet ds = ws.EndGetItems(ar); // 使用 lock 语句防止其他线程访问 // listview,直到完成对它的更新 lock(this.listView1) { // 遍历 DataSet 并将每个行的 Title_ID 以及 // Title 字段添加至 ListView foreach(DataRow drBook in ds.Tables[0].Rows) { // 创建一个新 ListViewItem 添加到 ListView ListViewItem book = new ListViewItem(); // 将 Title_ID 字段指定给 Text 属性 book.Text = drBook["Title_ID"].ToString(); // 将 Title 字段指定给第一个 SubItem book.SubItem[0].Text = drBook["Title"].ToString(); // 将书 ListViewItem 添加到 ListView listView1.Items.Add(book); } } }您还应该学习其他技术,例如,使用 Monitor 类和 Control.Invoke 来生成线程安全的应用程序。有关多线程编程技术的详细信息,可在 MSDN® Library 中找到。
- · .net的4个基本概念
- · 部署.net平台的程序
- · .net中何有效的使用Cache
- · 关于如何操作其他窗体的控件或变量的方法!
- · .net官方编码方法和命名规则
- · .NET 开发AutoCAD2006指南(二)
- · .NET开发AutoCAD指南(一)
- · 用.net 2003开发Windows CE应用,解决与pocket pc通讯的问题
- · .NET 开发AutoCAD2006指南(二)
- · 《.NET软件技术学习与实践》之序言
- · .net remoting范例
- · .net缓存应用与分析
- · 一种改进的轻量级.NET应用程序性能测试框架
- · 用.NET创建Windows服务
- · .net中清除EXCEL进程最有效的方法
- · 初探.NET中的delegate类型与.NET事件
- · .NET中自己构建一个ArrDictionary
- · 使用.NET生成Excel文件
- · 根据函数名称定位函数
- · .Net项目制作安装程序
- · 使用.net下的系统事件增强应用程序
- · Dotnet总结(4)--xml读写
- · Dotnet总结(3)--打印
- · Dotnet总结(2)--访问ms sql server 数据库基类--2
- · 如何使用.NET配置文件(一)
- · 将.aspx文件和图片编译进dll
- · .net如何实现页面间的参数传递
- · Microsoft .NET 中的简化加密
- · .Net远程方法调用研究
- · .net 里面 protected private 的变量也可以访问
- · 构建基本的.NET Remoting应用程序
- · 让你的.NET程序兼容不同版本的Dll文件
- · 谈Microsoft .NET战略
- · .net中xmlhttp下载文件的方法参考
- · .net Compact Flamework中MD5CryptoServiceProvider的实现
- · 把.NET程序部署到没有安装.NET Framwork的机器上
- · 在.NET下编写中文代码程序
- · ADO 与ADO.NET
