Mercurial > hg > Database > Christie-sharp
view datagear/DataGears.cs @ 8:e6f5b7d14dd1
update DataGears
author | riono <e165729@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 12 Oct 2020 00:49:32 +0900 |
parents | f48a2df9da65 |
children | ce6906edcbf4 |
line wrap: on
line source
using System; using System.Collections.Concurrent; using System.Collections.Generic; using Christie_net.datagear.command; namespace Christie_net.datagear.dg { public class DataGears { protected SortedDictionary<string, ConcurrentQueue<DataGear<Type>>> dataGears = new SortedDictionary<string, ConcurrentQueue<DataGear<Type>>>(); private readonly object syncObject = new object(); /// <summary> /// 新しいdataGearの追加 /// </summary> /// <param name="key"></param> /// <param name="dg"></param> public void Put(string key, DataGear<Type> dg) { lock (syncObject) { if (dataGears.ContainsKey(key)) { dataGears[key].Enqueue(dg); } else { var queue = new ConcurrentQueue<DataGear<Type>>(); queue.Enqueue(dg); dataGears.Add(key, queue); } } } /// <summary> /// DataGeraの取得と削除 /// </summary> /// <param name="key"></param> /// <returns></returns> public object Take(string key) { object data = null; // Queueからの取得は参照渡し DataGear<Type> dataGear; if (dataGears[key].TryDequeue(out dataGear)) { data = dataGear.GetData(); } // DataGeraを削除取り出ししたのでkeyも削除 if (dataGears[key].IsEmpty) { dataGears.Remove(key); } return data; } /// <summary> /// DataGeraを削除せずに取得 /// </summary> /// <param name="key"></param> /// <returns></returns> public object Peek(string key) { object data = null; DataGear<Type> dataGear; if (dataGears[key].TryPeek(out dataGear)) { data = dataGear.GetData(); } return data; } /// <summary> /// commandによりDataの取得 /// </summary> /// <param name="cm"></param> /// <returns></returns> public object GetData(Command cm) { lock (syncObject) { switch (cm.type) { case CommandType.TAKE: case CommandType.REMOTETAKE: return Take(cm.key); case CommandType.PEEK: case CommandType.REMOTEPEEK: return Peek(cm.key); } return null; } } /// <summary> /// Dataを挿入する /// </summary> /// <param name="cm"></param> public void SetData(Command cm) { lock (syncObject) { Put(cm.key, cm.dg); } } /// <summary> /// 既にkeyが含まれているか返す /// </summary> /// <param name="key"></param> /// <returns></returns> public bool ContainsKey(string key) { lock (syncObject) { return dataGears.ContainsKey(key); } } } }