zoukankan      html  css  js  c++  java
  • XML Web Service的异步调用中可能的问题

    1.服务(很简单)

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Services;
    
    namespace WebService1
    {
        /// <summary>
        /// Service1 的摘要说明
        /// </summary>
        [WebService(Namespace = "http://tempuri.org/")]
        [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
        [System.ComponentModel.ToolboxItem(false)]
        // 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。
        // [System.Web.Script.Services.ScriptService]
        public class Service1 : System.Web.Services.WebService
        {
    
            [WebMethod]
            public string HelloWorld()
            {
                System.Threading.Thread.Sleep(10000);
                return "Hello World";
            }
        }
    }
    

    2. 客户端(同样很简单)

    大家可以比较下面两段代码的区别

    using System;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                for (int i = 0; i < 10; i++)
                {
                    localhost.Service1SoapClient client = new localhost.Service1SoapClient();//注意这行代码的位置
    
                    client.HelloWorldCompleted += (o1, e1) =>
                    {
                        Console.WriteLine("{0}:{1}",DateTime.Now, e1.Result);
                    };
    
                    client.HelloWorldAsync();
                }
    
                Console.Read();
            }
        }
    }
    --这一种情况,因为client每次都会创建一个新的实例,所以它的工作是合乎要求的,只返回了10个结果。

    image

    另外一个写法(这可能是很多朋友会使用的方式)

    using System;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
    
                localhost.Service1SoapClient client = new localhost.Service1SoapClient();//注意这行代码的位置 
    
                for (int i = 0; i < 10; i++)
                {
    
                    client.HelloWorldCompleted += (o1, e1) =>
                    {
                        Console.WriteLine("{0}:{1}",DateTime.Now, e1.Result);
                    };
    
                    client.HelloWorldAsync();
                }
    
                Console.Read();
            }
        }
    }
    
    虽然代码很合理,但是它的工作结果却很奇怪。它返回的结果有70行。
    image 
    这说明什么问题呢?
    也就是说,如果一个服务代理的异步调用还没有完成之前,最后是不要继续调用它的其他异步操作。否则就会造成奇怪的现象。
  • 相关阅读:
    2017年前端开发者应该重拾基本技能学习
    手机号码月消费档次API
    实用且免费API接口2
    在线文档转换API word,excel,ppt等在线文件转pdf、png
    火车票抢票API 根据乘客的车次与座席要求快速订票出票
    利用问答机器人API开发制作聊天类App
    用聚合数据API(苏州实时公交API)快速写出小程序
    OllyDbg使用笔记
    解决git commit 大文件推送失败
    每日一语
  • 原文地址:https://www.cnblogs.com/chenxizhang/p/1627936.html
Copyright © 2011-2022 走看看