none
wdc 客户端多线程频繁访问通道 行不通 怎么办!!! RRS feed

  • 问题

  • wcf寄托在iis上面,现在客户端只有一个通道,客户端使用多线程频繁往服务器噻东西,实例一个线程没问题,2个线程并发的时候 发到2条就嗝屁了!! 怎么回事呢!!


    客户端

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.ServiceModel;
    using System.Threading;

    namespace Client
    {
        class Program
        {
            public static ServiceReference1.PersonServiceClient C;
            public static ServiceReference1.Person s = null;
            static void Main(string[] args)
            {
                InstanceContext Context = new InstanceContext(new CallBack());
                C = new ServiceReference1.PersonServiceClient(Context);
                for (int i = 0; i < 2 ; i++)
                {
                    Thread tt = new Thread(Execute);
                    tt.IsBackground = true;
                    tt.Start();
                }

                Console.ReadLine();
            }

            private static void Execute()
            {
                while (true)
                {
                    s = new ServiceReference1.Person();
                    s.Age = 0;
                    s.Id = "1";
                    s.Name = "test";
                    C.AddPerson(s);
                    Console.Write(C.GetPersons().Length);

                }
            }
        }

        class CallBack : ServiceReference1.IPersonServiceCallback
        {
            public void Send(string Message)
            {
                Console.WriteLine("[ClientTime{0:HHmmss}]Service Broadcast:{1}", DateTime.Now, Message);
            }
        }
    }




    服务器端实现契约


    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using WCFMessage;
    using WCFContract;
    using System.ServiceModel;

    namespace WCFService
    {
        [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant, MaxItemsInObjectGraph = 10000)]
        public class PersonService : IPersonService
        {
            public static object lockk = new object();
            List<Person> list = new List<Person>();
            public static ICallBackServer Call = null;
            public void AddPerson(Person person)
            {
                OperationContext.Current.Channel.OperationTimeout = TimeSpan.MaxValue;
                if (Call == null)
                {
                    Call = OperationContext.Current.GetCallbackChannel<ICallBackServer>();
                }
                Call.Send("已接收已接收已接收已接收已接收已接收已接收已接收");
                list.Add(person);

            }

            public List<Person> GetPersons()
            {
                return list;
            }

            public void RemovePerson(Person person)
            {
                list.Remove(list.Find(p => p.Id == person.Id));
            }
        }
    }
    2012年5月26日 3:45

全部回复