C# WebService调用及数据并行处理

        最近有个项目,涉及到客户自有的系统及公司开发的系统,两个系统数据存在不一致的情况,需要数据同步。客户自有的系统提供资源信息服务接口,公司部署的系统调用该接口将数据同步过来。

        客户给的是webservice接口,调用了一下,调用一次大概是2秒的样子,如果算上解析记录,差不多要2.4秒。由于数据量比较大,自然想到了并行处理。在.net framework4.0 中,提供了便捷的并行处理,不用自己再写线程了。

        周五同事写了部分程序,webservice的请求总是发不出去,由于当时还在处理其他的项目,没认真看他写的代码。今天重新整理下,写了个大体框架,只需将获取的数据同步到数据库,即可。代码如下:

ExpandedBlockStart.gif View Code
///   <summary>
///  同步数据对象。用于从webservice中获取数据后同步
///   </summary>
public   class  WebServiceClient{
       
private   const   string  WEBSERVICE_URL  =   " http://host/axis2/services/BookBeanServer " ;

       
public   static   string  LastError  =   string .Empty;

       
public  WebServiceClient() { }

       
///   <summary>
       
///  处理单本资源。为调用处使用并行处理,此处只处理单本资源。
        
///   </summary>
      
///   <param name="metaId"></param>
      
///   <returns></returns>
        public   bool  Process( string  metaId) {
                var result 
=   new  Book();
                
try  {
                    result.InitializeFrom(
this .GetBookOrignalXmlFromWebService(metaId));
                }
                
catch  (XmlException ex) {
                    LastError 
=  ex.Message;
                    
return   false ;
                }

                
return   this .SynData(result);
            }

       
private   string  GetBookOrignalXmlFromWebService( string  metaId) {
                MyWebServiceReference.BookBeanServerPortTypeClient client 
=   new  MyWebServiceReference.BookBeanServerPortTypeClient(
                    
new  WSHttpBinding(SecurityMode.None), 
                    
new  EndpointAddress(WEBSERVICE_URL)
                    );
                
object  obj  =  client.getBook( new   string [] { metaId });

                XmlNode[] nodes 
=  (XmlNode[])obj;
                
return  nodes.Length  >   0   ?  nodes[ 0 ].InnerXml :  string .Empty;
     }


     
private   bool  SynData(Book Book) {
            
// TODO:同步数据
               return   true ;
     }
            
}

      WebServiceClient表示单本资源处理类,其职责是调用WebService,将获取的数据同步到数据库。

       由于涉及到的数据量比较大,在调用出使用并行处理。.Net framework4.0中,提供了并行处理方案,在并行处理方面,更推荐使用其提供的Parallel类,与ThreadPool相比,减少了线程开销。

       调用处代码如下:

 1  Parallel.ForEach < string > (
 2                  GetMetaIds(), 
 3                  metaid  =>  { 
 4                      WebServiceClient client  =   new  WebServiceClient();
 5                      var temp  =  Task.Factory.StartNew(()  =>  {  return  client.Process(metaid); });
 6                      temp.ContinueWith(tmp  =>  { 
 7                           // TODO:处理同步处理的结果
 8                          Console.WriteLine(tmp.Result  ?   " ok "  :  " f " ); 
 9                      });
10                  }
11            );

      其中GetMetaIds()函数返回IList<string>数据,存储调用的WebService的参数集合。
      在Visual Studio中,在新建的项目中添加web service引用,会自动生成访问代理类。此处为webservice引用创建了MyWebServiceReference的命名空间。
      网上关于C# WebService的文章很多,搜索出来的多是用C#写的Producer和Consumer做为演示,与单独写Consumer还是有区别的。与Consumer在同一个solution中的Producer,添加WebService引用到Consumer工程后,能通过代理直接访问到,但是,如果添加另外的Consumer,生成的代理如果直接调用会让人有些迷惑,不知道怎么调用。

 

转载于:https://www.cnblogs.com/huankfy/archive/2011/04/10/2011743.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值