.NET应用程序中异步调用Web Service的几种方法 come from: veryhappy(wx.net)

测试程序界面

图一,调用前界面

 

图二,调用后界面

 

详细代码实现

闲言少叙,直接进入主题吧。首先一个声明一个类(将来在客户端与服务器间传递):

public class Class1
    
{
        
private int _ID;
        
private string _Name;
        
public int ID
        
{
            
get
            
{
                
return _ID;
            }

            
set
            
{
                _ID 
= value;
            }

        }
        

        
public string Name
        
{
            
get
            
{
                
return _Name;
            }

            
set
            
{
                _Name 
= value;
            }

        }

    }

 

其次,声明一个Web方法:

// 省略系统生成的Web Service声明代码,采用默认的

public class Service1 : System.Web.Services.WebService

{

        
//省略系统生成的Web Service声明代码,采用默认的

[WebMethod]

        
public Class1 GetClass1 ( int p_TimeSpan )

        {

            System.Threading.Thread.Sleep( p_TimeSpan ); 
// 线程停止一段执行,假设一段处理的时间

            Class1 r 
= new Class1();

            r.Name 
= "Async Call";

            r.ID 
= p_TimeSpan;

            
return r;

     }

}

 

客户端调用代码,设计一个Windows Form窗体来测试,放入3个按钮控件(分别代表3种异步调用方法),一个进度条控件(表示调用Web Service后,客户端继续进行某些操作)。先把3种方法介绍一下:

1.       利用Backgroundworker对象,所在命名空间System.ComponentModelMSDN原文解释:BackgroundWorker 类允许您在单独的专用线程上运行操作。耗时的操作(如下载和数据库事务)在长时间运行时可能会导致用户界面 (UI) 似乎处于停止响应状态。如果您需要能进行响应的用户界面,而且面临与这类操作相关的长时间延迟,则可以使用 BackgroundWorker 类方便地解决问题。

2.       利用wsdl.exe生成Web Service的客户端代理类,调用其中WebMethodAsync方法。

3.       利用wsdl.exe生成Web Service的客户端代理类,分别调用其中WebMethodBeginEnd方法。

 

先用wsdl.exe把上面的Web Service生成客户端代理类并把他编译成类库引入Windows应用项目(这里我没有编译类库,而是直接把代理类.cs文件加入到了Windows应用项目中)。

进入Visual Studio命令行模式,运行

wsdl /out:MyService.cs http://localhost:2732/Service1.asmx

参数说明:第二个参数是Web ServiceURL,这个是我机器的本地环境,其他人需要根据情况修改!

注:第一种方式的调用,不采用手动生成Web Service客户端代理类也可以(项目中直接添加Web引用)。后面两种方法都是通过Web Service代理类中提供的方法实现,因此必须生成这个代理类。

 

看一下处理进度条控件值的代码,几种调用方法都会用到,

private void ChangeProcessBar ( )

        {

            
for ( int i = 0; i < 10; i++ )

            {

                progressBar1.Value 
= i;

                
// 不知道用多少时间,慢慢走吧:)

                System.Threading.Thread.Sleep( 
500 );

            }

        }
 

 

 

第一种方式调用,

private void button1_Click ( object sender, EventArgs e )

        {

            AsyncCall_In_Backgroundworker();

        }

 

        
#region AsyncCall_In_Backgroundworker

        
private void AsyncCall_In_Backgroundworker ( )

        {

            BackgroundWorker backgroundworker 
= new BackgroundWorker();

            backgroundworker.DoWork 
+= new DoWorkEventHandler( back_DoWork );// 注册具体异步处理的方法

            backgroundworker.RunWorkerCompleted 
+= new RunWorkerCompletedEventHandler( back_RunWorkerCompleted );// 注册调用完成后的回调方法

            backgroundworker.RunWorkerAsync();
// 这里开始异步调用

            ChangeProcessBar(); 
// 调用同时客户端处理不停止

        }

 

        
void back_RunWorkerCompleted ( object sender, RunWorkerCompletedEventArgs e )

        {

            
if ( e.Error != null )

                
throw e.Error;

            progressBar1.Value 
= progressBar1.Maximum; // 调用完成了,把客户端进度条填充满

            Class1 result 
= e.Result as Class1; // 结果转化为Class1对象

            MessageBox.Show( 
"ID is " + ( result.ID.ToString() + ",Name is " + result.Name.ToString() ) ); //显示从服务器获取的对象值

        }

 

        
void back_DoWork ( object sender, DoWorkEventArgs e )

        {

            Service1 service1 
= new Service1(); // Web Service代理类

            e.Result 
= service1.GetClass1( 2500 ); // 调用Web方法GetClass1,结果赋值给DoWorkEventArgs的Result对象

        }

        
#endregion

 

第二种方式调用,

private void button2_Click ( object sender, EventArgs e )

        {

            AsynCall_In_WebServiceProxy();

        }

 

        
#region AsynCall_In_WebServiceProxy

        
private void AsynCall_In_WebServiceProxy ( )

        {

            Service1 service1 
= new Service1(); // Web Service代理类

            service1.GetClass1Async( 
3000 ); // 这里开始异步调用

            service1.GetClass1Completed 
+= new GetClass1CompletedEventHandler( s_GetClass1Completed ); // 注册调用完成后的回调方法

            ChangeProcessBar();
// 调用同时客户端处理不停止

        }

 

        
void s_GetClass1Completed ( object sender, GetClass1CompletedEventArgs e )

        {

            
if ( e.Error != null )

                
throw e.Error;

            progressBar1.Value 
= progressBar1.Maximum; // 调用完成了,把客户端进度条填充满

            Class1 result 
= e.Result as Class1; // 结果转化为Class1对象

            MessageBox.Show( 
"ID is " + ( result.ID.ToString() + ",Name is " + result.Name.ToString() ) ); // 显示从服务器获取的对象值

        }

        
#endregion

 

第三种调用,

private void button3_Click ( object sender, EventArgs e )

        {

            AsynCall_In_WebServiceProxyOther();

        }

 

        
#region AsynCall_In_WebServiceProxyOther

        
private void AsynCall_In_WebServiceProxyOther ( )

        {

            Service1 service1 
= new Service1(); // Web Service代理类

            service1.BeginGetClass1( 
3000, OnWebMethodCompleted, null ); // 这里开始异步调用

            ChangeProcessBar();
// 调用同时客户端处理不停止

        }

 

        
private void OnWebMethodCompleted ( IAsyncResult p_AsyncResult )

        { 
// 方法声明必须带有IAsyncResult类型对象

            Service1 service1 
= new Service1();// Web Service代理类

            Class1 result 
= service1.EndGetClass1( p_AsyncResult ); // 结束调用时结果返回

            MessageBox.Show( 
"ID is " + ( result.ID.ToString() + ",Name is " + result.Name.ToString() ) ); // 显示从服务器获取的对象值

        }

        
#endregion

 

细心的读者可能发现第三种方法并没有在调用完成后把客户端的进度条填满,的确在OnWebMethodCompleted中调用progressBar1.Value = progressBar1.Maximum时会出现InvalidOperationException异常,线程间操作无效: 从不是创建控件“progressBar1”的线程访问它。这个异常恐怕在.net下写过多线程操作的人都看到过:)。可以声明一个委托,把处理进度条的代码放到一个方法中,用窗体的Invoke去安全的调用它。好下面把修改的代码写出来,注意加粗的部分

private delegate void MaxProcessBarEventHandle ( ); // 声明最大化客户端进度条控件方法的委托

        
private void OnWebMethodCompleted ( IAsyncResult p_AsyncResult )

        {

            Service1 service1 
= new Service1();

            Class1 result 
= service1.EndGetClass1( p_AsyncResult );

            MessageBox.Show( 
"ID is " + ( result.ID.ToString() + ",Name is " + result.Name.ToString() ) );

            
this.Invoke( new MaxProcessBarEventHandle( MaxProcessBar ) ); // 从进度条创建的线程安全调用MaxProcessBar方法

        }

 

        
private void MaxProcessBar ( )

        {

            
// 客户端进度条最大化方法


            progressBar1.Value 
= progressBar1.Maximum;

        }

转载于:https://www.cnblogs.com/fifastar/archive/2008/07/07/1237525.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/305262.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

完美国际真数苹果_如果给你推荐一款很贵,但好用的苹果手机壳,你会买吗?...

【引言】说到全球最热门的手机&#xff0c;大家都知道一定是iPhone啦&#xff0c;作为系统和功能整合得最优秀的手机&#xff0c;不足的地方也非常明显&#xff0c;比如外壳不耐剐蹭&#xff0c;维修成本很高......&#xff0c;所以大多数果粉都会选择保护壳或者贴膜来保护自己…

使用缓存防击穿,解决微信”被动回复用户消息”重试回复问题

背景做微信公众号开发的时候&#xff0c;其中有个接收普通消息、接收事件推送 API。有这么条规则&#xff0c; ”微信服务器在五秒内收不到响应会断掉连接&#xff0c;并且重新发起请求&#xff0c;总共重试三次。假如服务器无法保证在五秒内处理并回复&#xff0c;可以直接回…

美国硅谷预测10年后的世界,再不懂你就落伍了

预测毕竟是预测&#xff0c;不一定会全部都会实现&#xff0c;但其中相当多的一部分将会成为我们生活中的现实。生活在信息社会的每一个人&#xff0c;都应该对这些发展趋势有所了解&#xff0c;特此推荐给我们的读者朋友。现在因为人工智能(AI)的发展&#xff0c;配合更高速度…

谷歌浏览器安卓_安卓免费时代结束,国产手机或将集体涨价?

天下没有免费的午餐&#xff0c;免费多年的谷歌安卓系统或许即将成为历史。昨天上午&#xff0c;有网友发现&#xff0c;安卓官方推特账号发布推文&#xff0c;宣称公司计划在今年第三季度向中国手机厂商收取费用&#xff0c;包括华为、中兴、小米等。尽管这条消息又被秒删&…

参赛方案-主机托管、中小企业虚拟化应用

方案1&#xff1a;单服务器主机托管解决方案<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />1.1 用户需求 在Internet普及的今天&#xff0c;每个单位都加大了在信息化方面前进的步伐&#xff0c;其中一个最基本的表现就是在电信…

腾讯急招.NET,但你准备好了吗?

新年至&#xff0c;腾讯开招.NET&#xff01;你准备好了吗&#xff1f;展望2021&#xff0c;可以预见.NET5、微服务、云原生将是大热话题&#xff0c;高并发必备的Redis、MongoDB、ElasticSearch依旧热门。新的一年&#xff0c;大厂对.NETer需求越来越大&#xff0c;大家要如何…

国庆中秋活动——让孩子亲近数学并爱上数学:《数学小侦探》来袭(来自科大出版社的福利)

通知&#xff01;通知&#xff01;通知&#xff01;&#xff01;&#xff01;玩酷屋十一黄金优惠限时限量秒杀活动&#xff0c;能抢到算你厉害&#xff1a;1、活动期间 2017/09/30 22:30 ——2017/10/03 22:302、【数学小侦探】原价 82元&#xff0c;秒杀活动价 76元3、节假日…

hadoop可以解决什么问题_聊一聊,临时工外包可以为企业解决什么问题

企业存在用人难的问题已经不是一天两天了&#xff0c;有些企业为了解决用人难的问题会选择临时工外包服务&#xff0c;相信大家都是知道这样的方式&#xff0c;可以有效的节省企业的人力物力&#xff0c;但大家都比较关心的是临时工外包可以为企业解决什么问题&#xff1f;现在…

图文并茂——使用xfire编写webservice,并通过C#调用

.首先建立一个web service工程&#xff1a;点击finish之后&#xff0c;myeclipse自动帮你生成services.xml以及web应用目录结构&#xff0c;其中的services.xml是你导出服务的配置文件&#xff0c;注意在WEB-INF/web.xml文件中配置了xfire自己的servlet. <servlet><se…

如何在 ASP.Net Core 中使用 Serilog

记录日志的一个作用就是方便对应用程序进行跟踪和排错调查&#xff0c;在实际应用上都是引入 日志框架&#xff0c;但如果你的 日志文件 包含非结构化的数据&#xff0c;那么查询起来将是一个噩梦&#xff0c;所以需要在记录日志的时候采用结构化方式。将日志结构化可以更容易的…

看国外女神级程序员,直播写代码一年的感悟

我第一次直播写代码是在去年七月份。我想要直播一下我在业余时间内为开源项目领域所做的工作&#xff0c;尽管在youtube上的大部分直播都是关于游戏的。我比较擅长于NodeJS的硬件库方面的工作&#xff08;尽管大部分项目都是自己的&#xff09;。并且我在youtube上曾经开启过一…

windows制作定时关机脚本_自动关机、自动打开程序… 让Windows自动执行任何操作...

文章转载于网络&#xff0c;侵删Windows 中有一个非常棒的功能&#xff0c;叫做“任务计划程序”&#xff0c;但是因为它的界面看起来有点复杂&#xff0c;导致很少有人使用它。其实对于任何人而言&#xff0c;“任务计划程序”都是非常棒的工具&#xff0c;它可以让 Windows 在…

techempower拿分系列之aspcore分析

techempower是一个Web Framework Benchmarks测试平台&#xff0c;世界上各大Web框架都参与其中&#xff0c;当然BeetleX也不例外。接下来的几篇文章中讲述aspcore使用怎样的方式在这评测中获取相对比较高的分数&#xff1b;而BeetleX使用了这些技巧之后也在是近测中获取的前10&…

mysqlbinlog工具_mysqlbinlog命令详解 Part 1-实验环境准备

前面的一些章节我们对mysqldump常用命令进行了讲解这个专题的内容为mysqlbinlog命令的详解mysqlbinlog是mySQL中用来处理binlog的工具1. MySQL二进制日志介绍服务器的binlog包含一些event这些event描述了数据库内容的状态&#xff0c;包含了数据修改&#xff0c;服务器重启等&a…

是学习Java还是Python?一张图告诉你!

Java 和 Python 一直都是两种很火很强大的编程语言&#xff0c;对于刚开始起步学习编程的同学来说&#xff0c;会迷惑且最经常问的问题是&#xff0c;我该学 Java 还是 Python&#xff0c;是不是 Python 容易学&#xff0c;或是应该先学什么编程语言等等这样的问题。作为一名 J…

Java游戏吉他英雄_《吉他英雄:现场》《摇滚乐队4》横向对比:各有所长!

《吉他英雄&#xff1a;现场》《摇滚乐队4》横向对比&#xff1a;各有所长&#xff01;2015-11-29 10:29:07来源&#xff1a;界面编辑&#xff1a;评论(0)作为摇滚游戏界两大支柱&#xff0c;最近回归的《吉他英雄&#xff1a;现场(Guitar Hero Live)》(以下简称GHL)和《摇滚乐…

_云计算学习路线图素材课件,Linux中软件安装的方式

很多初学者感觉云计算就是一个听起来比较高大上的名词&#xff0c;每次想要了解它的时候都像是雾里看花&#xff0c;迷迷糊糊看不真切&#xff0c;至于它是干什么的就更不了解了&#xff0c;其实云计算学起来在IT行业中还是比较容易上手的&#xff0c;接下来我给大家分享Linux中…

Redis集群搭建很easy

前言 哨兵模式虽然让读写分离更加高可用&#xff0c;但单台服务器由于本身的内存和CPU瓶颈&#xff0c;对于高并发和大数据业务的应用场景还是远远不能满足&#xff1b;对于这种情况&#xff0c;有点经验的小伙伴会毫不犹豫的想到集群&#xff0c;搞他好几个节点&#xff0c;负…

国庆中秋活动——读完这两套书,宝宝就变小小物理学家了!

通知&#xff01;通知&#xff01;通知&#xff01;&#xff01;&#xff01;玩酷屋十一黄金优惠限时限量秒杀活动&#xff0c;能抢到算你厉害&#xff1a;1、活动期间 2017/10/02 22:30 ——2017/10/05 22:302、【宝宝的物理学】第一辑 原价&#xff1a;189元&#xff0c;秒…

java的正则表达式 CPU_小心踩雷!一个小小的正则表达式竟把CPU拖垮......

原标题&#xff1a;小心踩雷&#xff01;一个小小的正则表达式竟把CPU拖垮......“前几天线上一个项目监控信息突然报告异常&#xff0c;上到机器上后查看相关资源的使用情况&#xff0c;发现 CPU 利用率将近 100%。通过 Java 自带的线程 Dump 工具&#xff0c;我们导出了出问题…