• 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 
    这说明什么问题呢?
    也就是说,如果一个服务代理的异步调用还没有完成之前,最后是不要继续调用它的其他异步操作。否则就会造成奇怪的现象。
  • 相关阅读:
    【以前的空间】poj 2288 Islands and Bridges
    【以前的空间】网络流合集
    【以前的空间】 单调队列系列
    【以前的空间】几道平衡树
    【以前的空间】vijos 1720 阿狸的打字机
    对拍程序
    【Ubuntu】编写一个c语言代码
    用Matlab对数据进行线性拟合算法
    Oracle视图传递参数
    oracle decode的用法
  • 原文地址:https://www.cnblogs.com/chenxizhang/p/1627936.html
Copyright © 2020-2023  润新知