博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
异步调用webservice
阅读量:6576 次
发布时间:2019-06-24

本文共 5138 字,大约阅读时间需要 17 分钟。

异步调用webservice

 

      今天学习webservice的异步调用。找了很多都是说会在客户端生成的Proxy类中会生成Begin<方法名>和End<方法名>,然后在这两个方法之间调用自己的代码的方式实现异步操作。

  但是,在客户端的Proxy类中没有这样的方法,相反的却有<方法名>Async的方法。这个是不是新的异步调用新的实现方式呢?于是网上找了找发现了两篇很有价值的博文。

  一篇引用自,是李天平的。

     文中讲了两种异步调用的方法。一种是用后台线程直接调用webservice。webservice本身没有什么不同,就是最直接的调用。异步主要是通过后台线程(BackgroundWorker,仅WinForm中调用)实现。

  文中代码引用如下:

 1 
 
private
 
void
 button1_Click(
object
 sender, EventArgs e)  
 2 
 {  
 3 
     BackgroundWorker backgroundworker 
=
 
new
 BackgroundWorker();  
 4 
     
//
注册具体异步处理的方法  
 5 
     backgroundworker.DoWork 
+=
 
new
 DoWorkEventHandler(back_DoWork);  
 6 
     
//
注册调用完成后的回调方法  
 7 
     backgroundworker.RunWorkerCompleted 
+=
   
 8 
         
new
 RunWorkerCompletedEventHandler(back_RunWorkerCompleted);  
 9 
     
//
这里开始异步调用  
10 
     backgroundworker.RunWorkerAsync();  
11 
     
//
调用服务的同时客户端处理并不停止  
12 
     ChangeProcessBar();   
13 
 }  
14 
 
//
完成事件  
15 
 
void
 back_RunWorkerCompleted(
object
 sender, RunWorkerCompletedEventArgs e)  
16 
 {  
17 
     
if
 (e.Error 
!=
 
null
)  
18 
         
throw
 e.Error;  
19 
     progressBar1.Value 
=
 progressBar1.Maximum; 
//
调用完成了,把客户端进度条填充满  
20 
     
string
 price 
=
 e.Result.ToString();   
//
获取处理结果  
21 
     MessageBox.Show(
"
调用完成。价格是:
"
 
+
 price); 
//
显示从服务器获取的结果值  
22 
 }  
23 
 
//
调用方法  
24 
 
void
 back_DoWork(
object
 sender, DoWorkEventArgs e)  
25 
 {  
26 
     
//
Web Service代理类  
27 
     ProductService.LTPService service 
=
 
new
 ProductService.LTPService();  
28 
     
//
调用Web方法GetClass1,将结果赋值给DoWorkEventArgs的Result对象  
29 
     e.Result 
=
 service.GetProductPrice(
"
001
"
);   
30 
 } 

 

进度条显示函数:

 1 
//
<summary>  
 2 
//
界面的进度条显示  
 3 
//
</summary>  
 4 
void
 ChangeProcessBar()  
 5 
{  
 6 
    
for
 (
int
 i 
=
 
0
; i 
<
 
10
; i
++
)  
 7 
    {  
 8 
        progressBar1.Value 
=
 i;  
 9 
        System.Threading.Thread.Sleep(
500
);  
10 
    }  
11 

 

 

  第二种异步调用的方法是调用webservice内置的异步调用方式。这里主要就要调用<WebService方法名>Async方法来实现异步的。

  原文代码引用如下:

 1 
private
 
void
 button2_Click(
object
 sender, EventArgs e)  
 2 
{  
 3 
    
//
Web Service代理类  
 4 
    ProductService.LTPService service 
=
 
new
 ProductService.LTPService();  
 5 
    
//
这里开始异步调用  
 6 
    service.GetProductPriceAsync(
"
001
"
);   
 7 
    
//
注册调用完成后的回调方法  
 8 
    service.GetProductPriceCompleted 
+=
 
new
 ProductService.  
 9 
        GetProductPriceCompletedEventHandler(GetProductPriceCompleted);  
10 
    
//
调用同时客户端处理不停止    
11 
    ChangeProcessBar();  
12 
}  
13 
//
完成事件处理方法  
14 
void
 GetProductPriceCompleted(
object
 sender, ProductService.  
15 
            GetProductPriceCompletedEventArgs e)  
16 
{  
17 
    
if
 (e.Error 
!=
 
null
)  
18 
        
throw
 e.Error;  
19 
    progressBar1.Value 
=
 progressBar1.Maximum;  
//
调用完成了,把客户端进度条填充满  
20 
    
string
 price 
=
 e.Result.ToString();         
//
获取处理结果  
21 
    MessageBox.Show(
"
调用完成。价格是:
"
 
+
 price);   
//
显示从服务器获取的结果值  
22 

 

 

      另外一篇博文是冯东的,其中正好对上面讲到的内容作了些补充和总结,以及在Ajax方面做了些扩展叙述。

  其中有一点,就是在Web页面的属性中添加Async="true",以使页面可以调用webservice内置的异步功能。

  Web Method代码引用如下:

1 
   [WebMethod]
2 
   
public
 DLL.EmployeesDataTable getEmployee()
3 
   {
4 
      DLL.EmployeesDataTable result 
=
 
new
 DLL.EmployeesDataTable();
5 
      DLLTableAdapters.EmployeesTableAdapter eta 
=
 
new
 WebServiceAsyn.DLLTableAdapters.EmployeesTableAdapter();
6 
      eta.FillEmployee(result);
7 
      
return
 result;
8 
   }

 

  客户端调用代码引用如下:

 1 
/
实体化WebService引用
 2 
private
 AsynWebService.Service1 asynSer;
 3 
//
构造函数初始化 WebService引用,并为异步调用WebService设置好了结果处理函数【方法名Completed】(先这么叫吧,我也不知道怎么叫)
 4 
public
 _Default()
 5 
{
 6 
    asynSer 
=
 
new
 AsynWebService.Service1();
 7 
    asynSer.HelloWorldCompleted 
+=
 
new
 AsynWebService.HelloWorldCompletedEventHandler(asynSer_HelloWorldCompleted);
 8 
    asynSer.getEmployeeCompleted 
+=
 
new
 AsynWebService.getEmployeeCompletedEventHandler(asynSer_getEmployeeCompleted);
 9 
}
10 
protected
 
void
 Button1_Click(
object
 sender, EventArgs e)
11 
{
12 
    
//
开始异步调用HelloWorld;
13 
    asynSer.HelloWorldAsync();
14 
}
15 
16 
protected
 
void
 asynSer_HelloWorldCompleted(
object
 sender, AsynWebService.HelloWorldCompletedEventArgs e)
17 
{
18 
    
this
.Label1.Text 
=
 e.Result.ToString();
19 
}
20 
21 
protected
 
void
 asynSer_getEmployeeCompleted(
object
 sender, AsynWebService.getEmployeeCompletedEventArgs e)
22 
{
23 
    
this
.GridView1.DataSource 
=
 e.Result;
24 
    
this
.GridView1.DataBind();
25 
}
26 
protected
 
void
 Button2_Click(
object
 sender, EventArgs e)
27 
{
28 
    
//
开始异步调用getEmployee
29 
    asynSer.getEmployeeAsync();
30 
}

 

 

   下面是作者给出的Ajax的异步调用和作者对这两种异步调用方式的总结:

 1 
<
script language
=
"
javascript
"
 type
=
"
text/javascript
"
>
 2 
    
var
 xmlHttp;
 3 
    
function
 createXMLHttpRequest()
 4 
    {
 5 
    
if
(window.ActiveXObject)
 6 
    {
 7 
       xmlHttp 
=
 
new
 ActiveXObject(
"
Microsoft.XMLHTTP
"
);
 8 
    }
 9 
    
else
 
if
(window.XMLHttpRequest)
10 
    {
11 
       xmlHttp 
=
 
new
 XMLHttpRequest();
12 
    }        
13 
   }
14 
    
15 
    
function
 requestStart()
16 
    {
17 
        
if
(document.getElementById(
"
tbx1
"
).value.length 
<=
 
4
)
18 
        {
19 
            alert(
"
用户名的长度要求大于4个字符!
"
);
20 
            
return
 
false
;
21 
        }
22 
        document.getElementById(
"
sp1
"
).innerText 
=
 
"
Loding
"
;
23 
        
var
 url 
=
 
"
default.aspx?userName=
"
 
+
 document.getElementById(
"
tbx1
"
).value;
24 
    createXMLHttpRequest();
//
创建XMLHttpRequest对象
25 
    xmlHttp.onreadystatechange 
=
 callBack;
//
为XMLHttpRequest对象指定结果处理函数
26 
    xmlHttp.open(
"
GET
"
,url);
//
打开链接
27 
    xmlHttp.send(
null
);
//
发送请求
28 
    }
29 
    
//
结果处理函数                
30 
    
function
 callBack()
31 
    {
32 
    
if
(xmlHttp.readyState 
==
 
4
)
33 
    {
34 
       document.getElementById(
"
sp1
"
).innerText 
=
 xmlHttp.responseText;
35 
    }
36 
    }        
37 
<
/
script>

 

  作者给出的总结

  1:Ajax需要创建XMLHttpRequest对象,Asp.Net需要实体化WebService代理类对象

  2:XMLHttpRequest 对象需要指定结果处理函数,Asp.Net也需要指定结果处理函数
  3:XMLHttpRequest的结果处理函数必须在请求发送之前设置,Asp.Net同样也是需要在              方法被调用之前设置好结果处理函数

      作者还提到了一些Flex中的异步调用webservice的知识,用兴趣的同学可以到作者的原文中查看。

 

 

引用博文:

     

转载地址:http://gfgjo.baihongyu.com/

你可能感兴趣的文章
python中的字符串
查看>>
如何开启MySQL的慢查询日志
查看>>
函数函数
查看>>
sort_uniq.sh
查看>>
隆冬寒骨,风吹十一豪迈
查看>>
ConcurrentHashMap内部原理浅析
查看>>
redis.conf
查看>>
我的友情链接
查看>>
php底层运行机制(二)
查看>>
单用户模式
查看>>
修复微商城提交购物车时部分手机号码不识别
查看>>
我的友情链接
查看>>
nginx+keepalived构建主备负载均衡代理服务器
查看>>
强大的日志分析工具AWStats经典备忘
查看>>
java类的加载,链接,初始化
查看>>
使用Zabbix2.2自带的Mysql监控模板监控数据库
查看>>
40个迹象表明你还是PHP菜鸟
查看>>
如何杀死一个已经detached的screen会话?
查看>>
tcp/ip协议初识
查看>>
我的友情链接
查看>>