| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199 | 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;using MECF.Framework.Common.Event;using System.Threading.Tasks;namespace Aitex.Core.WCF{    [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)]    public class EventService : IEventService    {        ConcurrentDictionary<Guid, IEventServiceCallback> _callbackClientList = new ConcurrentDictionary<Guid, IEventServiceCallback>();        ConcurrentDictionary<Guid, bool> _isLockState = new ConcurrentDictionary<Guid, bool>();        public event Action<EventItem> OnEvent;        public event Action<bool> OnLockAndUnlockEvent;        public event Action<IEnumerable<string>> OnUpdateWaferEvent;        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("给客户端{0}发送事件失败,客户端被删除.", ids[i]), ex);                    IEventServiceCallback service;                    _callbackClientList.TryRemove(ids[i], out service);                    bool lockState = false;                    _isLockState.TryRemove(ids[i], out lockState);                }            }            if (OnEvent != null)            {                OnEvent(obj);            }            //System.Diagnostics.Trace.WriteLine(string.Format("[{0}]  -----   [{1}]     --------- [{2}]",  t1, t2, t3));        }        public void SetLockAndUnLock(string cmd, Guid guid)        {            Guid[] ids = _callbackClientList.Keys.ToArray();            if (cmd == "Unlock")            {                try                {                    _callbackClientList.Where(x => x.Key == guid).FirstOrDefault().Value.SendLockEvent(false);                    _isLockState[guid] = false;                    if (OnLockAndUnlockEvent != null)                    {                        OnLockAndUnlockEvent(false);                    }                }                catch (Exception ex)                {                    LOG.Error(string.Format("给客户端{0}发送事件失败,客户端被删除.", guid), ex);                    IEventServiceCallback service;                    _callbackClientList.TryRemove(guid, out service);                    bool lockState = false;                    _isLockState.TryRemove(guid, out lockState);                }            }            if (cmd == "Lock")            {                for (int i = 0; i < ids.Length; i++)                {                    try                    {                        if (_isLockState[ids[i]] == true)                        {                            _callbackClientList[ids[i]].SendLockEvent(_isLockState[ids[i]]);                        }                    }                    catch (Exception ex)                    {                        LOG.Error(string.Format("给客户端{0}发送事件失败,客户端被删除.", ids[i]), ex);                        IEventServiceCallback service;                        _callbackClientList.TryRemove(ids[i], out service);                        bool lockState = false;                        _isLockState.TryRemove(guid, out lockState);                    }                }                if (_isLockState.Where(x => x.Value == true).Count() == 0)                {                    try                    {                        _callbackClientList[guid].SendLockEvent(true);                        _isLockState[guid] = true;                        if (OnLockAndUnlockEvent != null)                        {                            OnLockAndUnlockEvent(true);                        }                    }                    catch (Exception)                    {                    }                                }            }        }        public void UpDateWafers(IEnumerable<string> modules)        {            foreach (var client in _callbackClientList)            {                Task.Run(() =>                 {                     try                     {                         client.Value.SendChangedWaferModule(modules);//客户端通过回调接受事件                     }                     catch (Exception ex)                     {                         LOG.Error(string.Format("给客户端{0}发送事件失败,客户端被删除.", client.Key), ex);                         _callbackClientList.TryRemove(client.Key, out IEventServiceCallback service);                         _isLockState.TryRemove(client.Key, out bool lockState);                     }                 });            }        }        public bool Register(Guid id)        {            try            {                if (!_callbackClientList.ContainsKey(id))                {                    LOG.Info(string.Format("客户端{0}已连接", id.ToString()), true);                }                _callbackClientList[id] = OperationContext.Current.GetCallbackChannel<IEventServiceCallback>();                               _isLockState[id] = false;            }            catch (Exception ex)            {                LOG.Error("监听事件发生错误", ex);            }            return true;        }        public void UnRegister(Guid id)        {            if (!_callbackClientList.ContainsKey(id))            {                LOG.Info(string.Format("客户端{0}断开连接", id.ToString()), true);            }            IEventServiceCallback service;            _callbackClientList.TryRemove(id, out service);            bool lockState = false;            _isLockState.TryRemove(id,out lockState);        }        public int Heartbeat()        {            return _counter++ % 100000;        }    }}
 |