WCF(Windows Communication Foundation) - 并发(Concurrent): ConcurrencyMode.Single:单线程并发模式。系统自动加锁,无并发问题 ConcurrencyMode.Reentrant:可重入的单线程并发模式。有可重入(回调)操作时,此模式才会生效,从回调返回的线程会进入队列尾部排队 ConcurrencyMode.Multiple:多线程并发模式。系统不会自动加锁,有并发问题 WCF(Windows Communication Foundation) - 限流(Throttle): maxConcurrentCalls - 服务中同时存在的最大活动消息数,默认值为 16 maxConcurrentInstances - 服务中同时存在的最大服务实例数,默认值为 Int32.MaxValue maxConcurrentSessions - 服务中同时存在的最大会话数,默认值为 10



化零为整WCF(12) - 并发和限流(Concurrent和Throttle)


作者:webabcd



介绍

WCF(Windows Communication Foundation) - 并发(Concurrent):

    1、ConcurrencyMode.Single:单线程并发模式。系统自动加锁,无并发问题

    ·InstanceContextMode.PerCall:每个线程都会被分配一个新的实例

    ·InstanceContextMode.PerSession:每个Session被分配一个新的实例,每个Session内同时只会有一个线程操作实例

    ·InstanceContextMode.Single:唯一实例,并发调用只会有一个线程操作实例

    2、ConcurrencyMode.Reentrant:可重入的单线程并发模式。有可重入(回调)操作时,此模式才会生效,从回调返回的线程会进入队列尾部排队

    ·InstanceContextMode.PerCall:每个线程都会被分配一个新的实例,当有回调操作时如果使用Single并发模式的话就会产生死锁(1、调用服务端;2、回调客户端;3、返回服务端,1的时候锁定了,到3的时候就无法执行了,所以死锁了),此时应该用Reentrant并发模式

    ·InstanceContextMode.PerSession:每个Session被分配一个新的实例,每个Session内同时只会有一个线程操作实例,Session内可重入

    ·InstanceContextMode.Single:唯一实例,并发调用只会有一个线程操作实例,全局可重入

    3、ConcurrencyMode.Multiple:多线程并发模式。系统不会自动加锁,有并发问题

    ·InstanceContextMode.PerCall:每个线程都会被分配一个新的实例,无并发问题

    ·InstanceContextMode.PerSession:每个Session被分配一个新的实例,每个Session内多线程操作实例的话会有并发问题

    ·InstanceContextMode.Single:唯一实例,允许多线程并发操作实例,有并发问题


WCF(Windows Communication Foundation) - 限流(Throttle):

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁    <behaviors>

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁        <serviceBehaviors>

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁            <behavior name="BehaviorPerCall">

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁                <!--httpGetEnabled - 指示是否发布服务元数据以便使用 HTTP/GET 请求进行检索,如果发布 WSDL,则为 true,否则为 false,默认值为 false-->

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁                <serviceMetadata httpGetEnabled="true"/>

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁                <!--maxConcurrentCalls - 服务中同时存在的最大活动消息数,默认值为 16-->

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁                <!--maxConcurrentInstances - 服务中同时存在的最大服务实例数,默认值为 Int32.MaxValue-->

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁                <!--maxConcurrentSessions - 服务中同时存在的最大会话数,默认值为 10-->

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁                <serviceThrottling maxConcurrentCalls="" maxConcurrentInstances="" maxConcurrentSessions="" />

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁            </behavior>

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁            <behavior name="BehaviorPerSession">

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁                <serviceMetadata httpGetEnabled="true"/>

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁                <serviceThrottling maxConcurrentCalls="" maxConcurrentInstances="" maxConcurrentSessions="" />

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁            </behavior>

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁            <behavior name="BehaviorSingle">

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁                <serviceMetadata httpGetEnabled="true"/>

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁                <serviceThrottling maxConcurrentCalls="" maxConcurrentInstances="1" maxConcurrentSessions="" />

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁            </behavior>

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁        </serviceBehaviors>

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁    </behaviors>


示例(以ConcurrencyMode.Reentrant为例)

1、服务

IDuplexReentrant.cs

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁using System;

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁using System.Collections.Generic;

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁using System.Linq;

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁using System.Text;

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁using System.ServiceModel;

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁namespace WCF.ServiceLib.Message

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_默认值_29化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_线程并发_30化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_线程并发_31{

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_回调接口_32化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_可重入_33    /**//// <summary>

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁_34    /// IDuplexReentrant接口(演示ConcurrencyMode.Reentrant)

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁_34    /// </summary>

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁_34    /// <remarks>

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁_34    /// IDuplexReentrantCallback - 回调接口

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_线程并发_38    /// </remarks>

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁_34    [ServiceContract(CallbackContract = typeof(IDuplexReentrantCallback))]

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁_34    public interface IDuplexReentrant

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_回调接口_32化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_可重入_33    化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_线程并发_31{

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_回调接口_32化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_可重入_33        /**//// <summary>

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁_34        /// Hello

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁_34        /// </summary>

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_线程并发_38        /// <param name="name">名字</param>

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁_34        [OperationContract]

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁_34        void HelloDuplexReentrant(string name);

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_线程并发_38    }

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁_34

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_回调接口_32化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_可重入_33    /**//// <summary>

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁_34    /// IDuplexReentrant回调接口

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_线程并发_38    /// </summary>

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁_34    public interface IDuplexReentrantCallback

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_回调接口_32化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_可重入_33    化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_线程并发_31{

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_回调接口_32化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_可重入_33        /**//// <summary>

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁_34        /// Hello

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁_34        /// </summary>

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_线程并发_38        /// <param name="name"></param>

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁_34        [OperationContract]

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁_34        void HelloDuplexReentrantCallback(string name);

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_线程并发_38    }

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁_69}

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁

DuplexReentrant.cs

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁using System;

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁using System.Collections.Generic;

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁using System.Linq;

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁using System.Text;

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁using System.ServiceModel;

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁namespace WCF.ServiceLib.Message

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_默认值_29化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_线程并发_30化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_线程并发_31{

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_回调接口_32化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_可重入_33    /**//// <summary>

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁_34    /// DuplexReentrant类 (演示ConcurrencyMode.Reentrant)

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁_34    /// </summary>

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁_34    /// <remarks>

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁_34    /// ConcurrencyMode - 获取或设置一个值,该值指示服务是支持单线程、多线程还是支持可重入调用。默认值为 System.ServiceModel.ConcurrencyMode.Single。

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁_34    /// Single - 服务实例是单线程的,且不接受可重入调用。

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁_34    /// Reentrant - 服务实例是单线程的,且接受可重入调用。

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁_34    /// Multiple - 服务实例是多线程的。

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_线程并发_38    /// </remarks>

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁_34    [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant)]

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁_34    public class DuplexReentrant : IDuplexReentrant

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_回调接口_32化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_可重入_33    化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_线程并发_31{

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_回调接口_32化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_可重入_33        /**//// <summary>

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁_34        /// Hello

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁_34        /// </summary>

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_线程并发_38        /// <param name="name">名字</param>

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁_34        public void HelloDuplexReentrant(string name)

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_回调接口_32化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_可重入_33        化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_线程并发_31{

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁_34            // 声明回调接口

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁_34            IDuplexReentrantCallback callback = OperationContext.Current.GetCallbackChannel<IDuplexReentrantCallback>();

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁_34

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁_34            // 调用回调接口中的方法

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁_34            callback.HelloDuplexReentrantCallback(name);

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_线程并发_38        }

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_线程并发_38    }

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁_69}

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁


2、宿主

DuplexReentrant.cs

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁using System;

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁using System.Collections.Generic;

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁using System.Linq;

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁using System.Text;

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁using System.ServiceModel;

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁namespace WCF.ServiceHost2.Message

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_默认值_29化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_线程并发_30化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_线程并发_31{

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_回调接口_32化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_可重入_33    /**//// <summary>

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁_34    /// host WCF.ServiceLib.Message.DuplexReentrant的类

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_线程并发_38    /// </summary>

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁_34    public class DuplexReentrant

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_回调接口_32化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_可重入_33    化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_线程并发_31{

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_回调接口_32化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_可重入_33        /**//// <summary>

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁_34        /// 启动WCF.ServiceLib.Message.DuplexReentrant服务

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_线程并发_38        /// </summary>

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁_34        public void Launch()

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_回调接口_32化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_可重入_33        化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_线程并发_31{

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁_34            using (ServiceHost host = new ServiceHost(typeof(WCF.ServiceLib.Message.DuplexReentrant)))

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_回调接口_32化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_可重入_33            化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_线程并发_31{

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁_34                host.Open();

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁_34

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁_34                Console.WriteLine("服务已启动(WCF.ServiceLib.Message.DuplexReentrant)");

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁_34                Console.WriteLine("按<ENTER>停止服务");

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁_34                Console.ReadLine();

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁_34

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_线程并发_38            }

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_线程并发_38        }

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_线程并发_38    }

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁_69}

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁

App.config

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁<?xml version="1.0" encoding="utf-8" ?>

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁<configuration>

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁    <system.serviceModel>

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁        <services>

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁            <!--name - 提供服务的类名-->

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁            <!--behaviorConfiguration - 指定相关的行为配置-->

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁            <service name="WCF.ServiceLib.Message.DuplexReentrant" behaviorConfiguration="MessageBehavior">

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁                <!--address - 服务地址-->

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁                <!--binding - 通信方式-->

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁                <!--contract - 服务契约-->

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁                <endpoint address="Message/DuplexReentrant" binding="netTcpBinding" contract="WCF.ServiceLib.Message.IDuplexReentrant" />

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁                <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁                <host>

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁                    <baseAddresses>

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁                        <add baseAddress="http://localhost:12345/Message/DuplexReentrant"/>

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁                        <add baseAddress="net.tcp://localhost:54321/"/>

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁                    </baseAddresses>

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁                </host>

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁            </service>

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁        </services>

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁        <behaviors>

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁            <serviceBehaviors>

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁                <behavior name="MessageBehavior">

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁                    <!--httpGetEnabled - 指示是否发布服务元数据以便使用 HTTP/GET 请求进行检索,如果发布 WSDL,则为 true,否则为 false,默认值为 false-->

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁                    <serviceMetadata httpGetEnabled="true" />

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁                    <serviceDebug includeExceptionDetailInFaults="true"/>

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁                </behavior>

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁            </serviceBehaviors>

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁        </behaviors>

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁    </system.serviceModel>

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁</configuration>

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁


3、客户端

DuplexReentrant.cs

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁using System;

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁using System.Collections.Generic;

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁using System.Linq;

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁using System.Text;

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁using System.ServiceModel;

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁using System.Windows.Forms;

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁namespace Client2.Message

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_默认值_29化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_线程并发_30化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_线程并发_31{

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_回调接口_32化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_可重入_33    /**//// <summary>

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁_34    /// 演示Message.DuplexReentrant的类

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_线程并发_38    /// </summary>

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁_34    public class DuplexReentrant

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_回调接口_32化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_可重入_33    化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_线程并发_31{

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_回调接口_32化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_可重入_33        /**//// <summary>

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁_34        /// Hello

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁_34        /// </summary>

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_线程并发_38        /// <param name="name">名字</param>

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁_34        public void HelloDulexReentrant(string name)

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_回调接口_32化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_可重入_33        化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_线程并发_31{

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁_34            var ct = new Client2.Message.ReentrantCallbackType();

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁_34            var ctx = new InstanceContext(ct);

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁_34

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁_34            var proxy = new MessageSvc.DuplexReentrant.DuplexReentrantClient(ctx);

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁_34

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁_34            proxy.HelloDuplexReentrant(name);

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_线程并发_38        }

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_线程并发_38    }

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁_69}

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁

ReentrantCallbackType.cs

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁using System;

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁using System.Collections.Generic;

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁using System.Linq;

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁using System.Text;

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁using System.Windows.Forms;

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁namespace Client2.Message

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_默认值_29化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_线程并发_30化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_线程并发_31{

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_回调接口_32化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_可重入_33    /**//// <summary>

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁_34    /// 实现回调接口

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁_34    /// </summary>

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁_34    /// <remarks>

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁_34    /// CallbackBehavior - 在客户端应用程序中配置回调服务实现

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁_34    /// UseSynchronizationContext - 如果对服务的所有调用都必须在 System.Threading.SynchronizationContext 指定的线程上运行,则为 true;否则为false。默认值为 true。

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_线程并发_38    /// </remarks>

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁_34    [System.ServiceModel.CallbackBehavior(UseSynchronizationContext = false)]

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁_34    public class ReentrantCallbackType : MessageSvc.DuplexReentrant.IDuplexReentrantCallback

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_回调接口_32化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_可重入_33    化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_线程并发_31{

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_回调接口_32化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_可重入_33        /**//// <summary>

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁_34        /// Hello

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁_34        /// </summary>

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_线程并发_38        /// <param name="name">名字</param>

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁_34        public void HelloDuplexReentrantCallback(string name)

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_回调接口_32化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_可重入_33        化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_线程并发_31{

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁_34            MessageBox.Show("Hello: " + name);

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_线程并发_38        }

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_线程并发_38    }

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁_69}

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁

App.config

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁<?xml version="1.0" encoding="utf-8" ?>

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁<configuration>

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁    <system.serviceModel>

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁        <client>

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁            <endpoint address="net.tcp://localhost:54321/Message/DuplexReentrant"

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁                binding="netTcpBinding" contract="MessageSvc.DuplexReentrant.IDuplexReentrant">

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁            </endpoint>

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁        </client>

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁    </system.serviceModel>

化零为整WCF(12) - 并发和限流(Concurrent和Throttle)_加锁</configuration>


运行结果:

单击"btnDuplexReentrant"按钮后弹出提示框,显示"Hello: webabcd"



OK