using Bro.Common.Interface; using Newtonsoft.Json; using System; using System.Threading; namespace Bro.Common.Base { public class InputConfigBase : IInputConfig { //public InputConfigBase() //{ // StateMachine.OnDeviceInput += OnDeviceInput; //} //[JsonIgnore] //public AutoResetEvent InputHanlder { get; set; } = new AutoResetEvent(false); // [JsonIgnore] //public string IConfigId = Guid.NewGuid().ToString(); //[JsonIgnore] //public Dictionary InputHanlderDict { get; set; } = new Dictionary(); //[JsonIgnore] //public Dictionary InputFlagDict { get; set; } = new Dictionary(); //[JsonIgnore] //public ConcurrentDictionary InputHanlderDict { get; set; } = new ConcurrentDictionary(); //[JsonIgnore] //public ConcurrentDictionary InputFlagDict { get; set; } = new ConcurrentDictionary(); [JsonIgnore] public bool BoundFlag { get; set; } = false; public bool IsInputNeed { get; set; } = false; public string InputMethodName { get; set; } /// /// 第三方设备输入参数 /// [JsonIgnore] public dynamic InputPara { get; set; } private string processId; [JsonIgnore] public string ProcessId { get { return processId; } set { if (processId != value) { //仅在工序编号赋值后建立消息连接 processId = value; //if (conn == null) //{ // conn = new HubConnection(GlobalVar.SignalRServer); // proxy = conn.CreateHubProxy("DeviceHub"); // proxy.On("OnDeviceInput", OnDeviceInput); // conn.Start().Wait(); //} //lock (this) { //InputHanlderDict[processId] = new AutoResetEvent(false); //InputFlagDict[processId] = false; //InputHanlderDict.AddOrUpdate(processId, new AutoResetEvent(false), (a, b) => { return new AutoResetEvent(false); }); //InputFlagDict.AddOrUpdate(processId, false, (a, b) => { return false; }); InputHandle = new AutoResetEvent(false); //StateMachine.OnDeviceInput += OnDeviceInput; } //if (StateMachine.OnDeviceInput != null) //{ // var list = StateMachine.OnDeviceInput.GetInvocationList().ToList(); // if (list != null) // { // if (!list.Any(d => // { // InputConfigBase icb = d.Target as InputConfigBase; // return icb.ProcessId == ProcessId; // })) // { // StateMachine.OnDeviceInput += OnDeviceInput; // } // } // else // { // StateMachine.OnDeviceInput += OnDeviceInput; // } //} //else //{ //StateMachine.OnDeviceInput += OnDeviceInput; //PubSubCenter.GetInstance().Subscribe(processId, OnDeviceInput); //} } } } [JsonIgnore] public AutoResetEvent InputHandle { get; set; } = new AutoResetEvent(false); public string ProcessName { get; set; } //HubConnection conn; //IHubProxy proxy; /// /// 适用于第三方的信号输入 /// /// //private object OnDeviceInput(ISubscriber sub, object param1, object param2) private void OnDeviceInput(InputPara obj) { //Debug.WriteLine(DateTime.Now.ToString("mm:ss.fff") + "\t输入流程:" + obj.ProcessId + ";\t本流程编号:" + ProcessId); //输入参数必须有一个字段是ProcessId,保存工序编号 //string processId = obj.ProcessId; //if (obj.ProcessId == ProcessId) //{ // InputPara = obj.ParaObj; // InputHanlderDict[].Set(); // BoundFlag = false; //} //InputPara obj = param1 as InputPara; //lock (this) { try { //if (InputHanlderDict.Keys.Contains(obj.ProcessId)) if (ProcessId == obj.ProcessId) { //Debug.WriteLine(DateTime.Now.ToString("mm:ss.fff") + "\t流程编号:" + obj.ProcessId); //InputHanlderDict[obj.ProcessId].Set(); //InputFlagDict[obj.ProcessId] = true; InputHandle.Set(); //InputHanlderDict.Remove(obj.ProcessId); //StateMachine.OnDeviceInput -= OnDeviceInput; //PubSubCenter.GetInstance().RemoveSubscriber(ProcessId, OnDeviceInput); } } catch (Exception) { } //return null; } } public virtual void Dispose() { //foreach (var handle in InputHanlderDict) //{ // handle.Value.Set(); //} //StateMachine.OnDeviceInput -= OnDeviceInput; //InputHanlderDict = new ConcurrentDictionary(); //InputFlagDict = new ConcurrentDictionary(); //GC.Collect(); } } [Serializable] public class InputPara : IProcessID { public string ProcessId { get; set; } //[DataMember] public dynamic ParaObj { get; set; } public string ProcessName { get; set; } } }