using System; using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Reflection; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; using SystemX.Common; using SystemX.Common.Archive; using SystemX.Common.Serialization; using SystemX.Net.BaseProtocol; namespace SystemX.Net.Schedule { public class ScheduleLabelManage { private byte ucLabelSize = 128; // 해당 위치 토큰 사용 여부 private bool[] bLabelUse; // 해당 위치 처리 여부 private bool[] bLabelComplete; private XData[] XLabelData; public byte GetLabelSize() { return ucLabelSize; } public void SetManageLabel() { bLabelUse = new bool[ucLabelSize]; bLabelComplete = new bool[ucLabelSize]; XLabelData = new XData[ucLabelSize]; bLabelUse.ToArray().Initialize(); bLabelComplete.ToArray().Initialize(); } public byte GetLabel(int nLabelPos = -1) { byte ucLabelPos = 0; if (nLabelPos == -1) { for (int i = 1; i < ucLabelSize - 1; i++) { if (bLabelUse[i] == false) { ucLabelPos = (byte)i; break; } } } else ucLabelPos = (byte)nLabelPos; if (ucLabelPos != 0) { bLabelComplete[ucLabelPos] = false; bLabelUse[ucLabelPos] = true; } return ucLabelPos; } public bool SetLabel(byte ucCheckLabelPos, XData setXLabelData) { if (ucCheckLabelPos < 0 || ucCheckLabelPos >= ucLabelSize) return false; if (bLabelUse[ucCheckLabelPos]) { XLabelData[ucCheckLabelPos] = setXLabelData; bLabelComplete[ucCheckLabelPos] = true; } return bLabelComplete[ucCheckLabelPos]; } public bool ClearLabel(byte ucCheckLabelPos) { if (ucCheckLabelPos < 0 || ucCheckLabelPos >= ucLabelSize) return false; if (bLabelUse[ucCheckLabelPos]) { bLabelUse[ucCheckLabelPos] = false; bLabelComplete[ucCheckLabelPos] = false; } return bLabelUse[ucCheckLabelPos]; } public XData CheckLabel(byte ucCheckLabelPos, ref bool bLabelProcessResult) { if (ucCheckLabelPos < 0 || ucCheckLabelPos >= ucLabelSize) return null; if (bLabelComplete[ucCheckLabelPos]) { bLabelComplete[ucCheckLabelPos] = false; bLabelUse[ucCheckLabelPos] = false; bLabelProcessResult = true; return XLabelData[ucCheckLabelPos]; } else { bLabelProcessResult = false; return null; } } } /// /// Packet Time, Retrty Num, Replay Packet, Packet Data, Packet Event, Label /// /// /// Data Time, Data Replay Result, Packet Protocol Info, Packet Header Info, Result Data Object, Label /// public class XPacket { public DateTime dtPacketTime; public int iRetryNum; public bool bReplayPacket; public byte[] ucPacketBytes; public SendRecvCallEvent deleCallEvt; public byte nLabel; } public class XData { public DateTime dtTime; public bool bReplayResult; public BASE_PROTOCOL BaseProtocol; public HEADER_PACKET HeaderPacket; public object objData; public byte nLabel; } public enum FlowControlType { Commnad = 0, Stream, } [Serializable] public class XDataSchedule { public List SendQueue; public List ReplySendQueue; public List SendRawSetQueue; public List RecvQueue; public XDataSchedule() { SendQueue = new List(); ReplySendQueue = new List(); SendRawSetQueue = new List(); RecvQueue = new List(); } } [Serializable] public class XSchedule { public ConcurrentQueue SendQueue { get; } public ConcurrentQueue ReplySendQueue { get; } public ConcurrentQueue SendRawSetQueue { get; } public ConcurrentQueue RecvQueue { get; } // public ConcurrentQueue RecvResultData { get; } public XSchedule() { SendQueue = new ConcurrentQueue(); ReplySendQueue = new ConcurrentQueue(); SendRawSetQueue = new ConcurrentQueue(); RecvQueue = new ConcurrentQueue(); RecvResultData = new ConcurrentQueue(); } } public class EventAwaiter { private readonly TaskCompletionSource _eventArrived = new TaskCompletionSource(); private readonly Action> _unsubscribe; public EventAwaiter(Action> subscribe, Action> unsubscribe) { subscribe(Subscription); _unsubscribe = unsubscribe; } public Task Task => _eventArrived.Task; private EventHandler Subscription => (s, e) => { _eventArrived.TrySetResult(e); _unsubscribe(Subscription); }; /* var valueChangedEventAwaiter = new EventAwaiter( h => example.YourEvent += h, h => example.YourEvent -= h); await valueChangedEventAwaiter.Task; */ } }