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 
这说明什么问题呢?
也就是说,如果一个服务代理的异步调用还没有完成之前,最后是不要继续调用它的其他异步操作。否则就会造成奇怪的现象。
posted @ 2009-12-19 21:34  陈希章  阅读(402)  评论(0编辑  收藏  举报