Wcf异步调用简单示例

WCF异步调用重要的一点就是跟服务契约毫无关系,异步或者非异步都是客户端说了算.所以要想让客户端异步调用服务,如何配置客户端是重点了,下面我来介绍:

1.首先是一个简单的服务契约定义

View Code
//在这里我故意使用非会话服务,也就是说异步不异步跟会话没关系
[ServiceContract(SessionMode= SessionMode.NotAllowed)]
    interface IWcfService
    {
        [OperationContract]
        string SayHello(string name);
    }

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
    class WcfService:IWcfService
    {
        public string SayHello(string name)
        {
            Console.WriteLine(name+ " is connected");
            return "Welcome! "+name;
        }
    }

2.客户端引入服务定义,我在这里使用VS的自动导入功能,并勾选自动生成异步操作

Wcf异步调用简单示例_第1张图片

在客户端的服务定义里会自动生成异步的BeginSayHello和EndSayHello方法

View Code
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ServiceModel.ServiceContractAttribute(ConfigurationName="WcfService.IWcfService", SessionMode=System.ServiceModel.SessionMode.NotAllowed)]
    public interface IWcfService {
        
        [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IWcfService/SayHello", ReplyAction="http://tempuri.org/IWcfService/SayHelloResponse")]
        string SayHello(string name);
        
        [System.ServiceModel.OperationContractAttribute(AsyncPattern=true, Action="http://tempuri.org/IWcfService/SayHello", ReplyAction="http://tempuri.org/IWcfService/SayHelloResponse")]
        System.IAsyncResult BeginSayHello(string name, System.AsyncCallback callback, object asyncState);
        
        string EndSayHello(System.IAsyncResult result);
    }

因此客户端调用服务的时候可以用同步也可以用异步,想咋的就咋的.但是要注意一下微软异步编程模型(APM)的使用方法:

View Code
WcfServiceClient proxy = new WcfServiceClient();
            string info = proxy.SayHello("HarleyHu"); //同步
            Console.WriteLine(info);

            proxy.BeginSayHello("HuWen",
            ia=>{
                info = ((WcfServiceClient)ia.AsyncState).EndSayHello(ia); //异步
                Console.WriteLine(info);
            },
            proxy);
            Console.Read();

今天就到这了

 

你可能感兴趣的:(异步调用)