| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 | using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.ServiceModel;using Aitex.Core.RT.Log;using Aitex.Core.RT.Event;using Aitex.Core.Util;using Aitex.Core.WCF.Interface;using System.Collections.Concurrent;namespace Aitex.Core.WCF{    [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)]    public class EventService : IEventService    {        ConcurrentDictionary<Guid, IEventServiceCallback> _callbackClientList = new ConcurrentDictionary<Guid, IEventServiceCallback>();        public event Action<EventItem> OnEvent;        private int _counter;        public EventService()        {        }        public void FireEvent(EventItem obj)        {            //DeviceTimer _timer = new DeviceTimer();            //_timer.Start(0);            //double t1 = 0;            //double t2 = 0;            //double t3 = 0;                        //t1 = _timer.GetElapseTime();            Guid[] ids = _callbackClientList.Keys.ToArray();            for (int i = 0; i < ids.Length; i++)            {                try                {                    //t2 = _timer.GetElapseTime() - t1;                    _callbackClientList[ids[i]].SendEvent(obj);                    //t3 = _timer.GetElapseTime() - t2;                }                catch (Exception ex)                {                    LOG.Error(string.Format("Failed to send event to client {0}, the client has been deleted.", ids[i]), ex);                    IEventServiceCallback service;                    _callbackClientList.TryRemove(ids[i], out service);                }            }            if (OnEvent != null)            {                OnEvent(obj);            }            //System.Diagnostics.Trace.WriteLine(string.Format("[{0}]  -----   [{1}]     --------- [{2}]",  t1, t2, t3));        }        public bool Register(Guid id)        {            try            {                if (!_callbackClientList.ContainsKey(id))                {                    LOG.Info(string.Format("Client {0} has been connected", id.ToString()), true);                }                _callbackClientList[id] = OperationContext.Current.GetCallbackChannel<IEventServiceCallback>();            }            catch (Exception ex)            {                LOG.Error("Monitoring event error occurred", ex);            }            return true;        }        public void UnRegister(Guid id)        {            if (!_callbackClientList.ContainsKey(id))            {                LOG.Info(string.Format("Client {0} disconnected", id.ToString()), true);            }            IEventServiceCallback service;            _callbackClientList.TryRemove(id, out service);        }        public int Heartbeat()        {            return _counter++ % 100000;        }    }}
 |