.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;所以大多数果粉都会选择保护壳或者贴膜来保护自己…

水域大小 Java_leetcode —— 面试题 16.19. 水域大小

你有一个用于表示一片土地的整数矩阵land&#xff0c;该矩阵中每个点的值代表对应地点的海拔高度。若值为0则表示水域。由垂直、水平或对角连接的水域为池塘。池塘的大小是指相连接的水域的个数。编写一个方法来计算矩阵中所有池塘的大小&#xff0c;返回值需要从小到大排序。示…

python数组的切片操作_对Python 数组的切片操作

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里技术人对外发布原创技术内容的最大平台&…

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

背景做微信公众号开发的时候&#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;其中一个最基本的表现就是在电信…

Java项目几个月能完成_c#项目转JAVA,第5个月,基本完成

c#转JAVA&#xff0c;在LINUX Ubutu上安装JDK&#xff0c;并运行JAVA程序即然选择JAVA&#xff0c;自然是自已写的程序要在各个OS上能跑&#xff0c;下面是安装教程&#xff0c;是通过网络在线安装的&#xff0c;输几个命令然后等待几个&#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;现在…

dbscan用 java代码_聚类算法之DBScan(Java实现)[转]

package orisun;import java.io.File;import java.util.ArrayList;import java.util.Vector;import java.util.Iterator;public classDBScan {double Eps3; //区域半径int MinPts4; //密度//由于自己到自己的距离是0,所以自己也是自己的neighborpublic Vector getNeighbors(Dat…

图文并茂——使用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;所以需要在记录日志的时候采用结构化方式。将日志结构化可以更容易的…

python可视化工具好用_6款Python必备的可视化工具推荐

想像阅读书本一样阅读数据流&#xff1f;这只有在电影中才有可能发生。 在现实世界中&#xff0c;企业必须使用数据可视化工具来读取原始数据的趋势和模式。尽管实际上存在着无数专门用于大数据可视化的工具&#xff0c;且它们都是既开源又专有的&#xff0c;在这其中还是有一些…

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

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

java八进制转十六进制_java-十进制、八进制、十六进制数互相转换

public class JZTurn {public static void main(String[] args) {int num2 1314521;System.out.println("十进制数:"num2);System.out.println("十进制转换二进制:"turn2(num2));System.out.println("十进制转换八进制:"turn8(num2));System.ou…

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

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

techempower拿分系列之aspcore分析

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

对症下药教你清除电脑中的木马

特洛伊木马是一种基于远程控制的病毒程序&#xff0c;该程序具有很强的隐蔽性和危害性&#xff0c;它可以在不知情的的状态下控制或者监视用户的电脑。下面就讲讲木马经常藏身的地方和清除方法。  首先查看自己的电脑中是否有木马   1、集成到程序中   其实木马也是一个服…