Mercurial > hg > Database > Christie-sharp
changeset 19:c9d1a5a79254
fix ConcurrentQueue
author | riono <e165729@ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 01 Dec 2020 17:48:03 +0900 |
parents | 8fe565f8acb8 |
children | 3aaa77e12493 |
files | daemon/Connection.cs datagear/DataGears.cs datagear/WaitList.cs |
diffstat | 3 files changed, 59 insertions(+), 25 deletions(-) [+] |
line wrap: on
line diff
--- a/daemon/Connection.cs Wed Nov 25 01:27:41 2020 +0900 +++ b/daemon/Connection.cs Tue Dec 01 17:48:03 2020 +0900 @@ -10,7 +10,7 @@ public Socket socket; public string name; //public CodeGearManager cgm; - public ConcurrentQueue<Command> sendQueue = new ConcurrentQueue<Command>(); + public BlockingCollection<Command> sendQueue = new BlockingCollection<Command>(); public bool sendManager = true; private object syncObject = new object(); @@ -22,7 +22,7 @@ public Connection(){} public void SendCommand(Command cmd) { - sendQueue.Enqueue(cmd); + sendQueue.TryAdd(cmd); } /// <summary>
--- a/datagear/DataGears.cs Wed Nov 25 01:27:41 2020 +0900 +++ b/datagear/DataGears.cs Tue Dec 01 17:48:03 2020 +0900 @@ -7,8 +7,8 @@ namespace Christie_net.datagear { public class DataGears { - protected SortedDictionary<string, ConcurrentQueue<DataGear<object>>> dataGears = - new SortedDictionary<string, ConcurrentQueue<DataGear<object>>>(); + protected SortedDictionary<string, BlockingCollection<DataGear<object>>> dataGears = + new SortedDictionary<string, BlockingCollection<DataGear<object>>>(); private readonly object syncObject = new object(); @@ -20,10 +20,10 @@ public void Put(string key, DataGear<object> dg) { lock (syncObject) { if (dataGears.ContainsKey(key)) { - dataGears[key].Enqueue(dg); + dataGears[key].TryAdd(dg); } else { - var queue = new ConcurrentQueue<DataGear<object>>(); - queue.Enqueue(dg); + var queue = new BlockingCollection<DataGear<object>>(); + queue.TryAdd(dg); dataGears.Add(key, queue); } } @@ -35,19 +35,21 @@ /// <param name="key"></param> /// <returns></returns> public object Take(string key) { - object data = null; - // Queueからの取得は参照渡し - DataGear<object> dataGear; - if (dataGears[key].TryDequeue(out dataGear)) { - data = dataGear.GetData(); + lock (syncObject) { + object data = null; + // Queueからの取得は参照渡し + DataGear<object> dataGear; + if (dataGears[key].TryTake(out dataGear)) { + data = dataGear.GetData(); + } + + // DataGeraを削除取り出ししたのでkeyも削除 + if (dataGears[key].IsCompleted) { + dataGears[key].Dispose(); + dataGears.Remove(key); + } + return data; } - - // DataGeraを削除取り出ししたのでkeyも削除 - if (dataGears[key].IsEmpty) { - dataGears.Remove(key); - } - - return data; } /// <summary> @@ -56,13 +58,15 @@ /// <param name="key"></param> /// <returns></returns> public object Peek(string key) { - object data = null; - DataGear<object> dataGear; - if (dataGears[key].TryPeek(out dataGear)) { - data = dataGear.GetData(); + lock (syncObject) { + object data = null; + DataGear<object> dataGear; + ConcurrentQueue<DataGear<object>> queue = new ConcurrentQueue<DataGear<object>>(dataGears[key]); + if (queue.TryPeek(out dataGear)) { + data = dataGear.GetData(); + } + return data; } - - return data; } /// <summary>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/datagear/WaitList.cs Tue Dec 01 17:48:03 2020 +0900 @@ -0,0 +1,30 @@ +using System.Collections; +using System.Collections.Concurrent; +using System.Collections.Generic; +using Christie_net.datagear.command; + +namespace Christie_net.datagear { +public class WaitList { + private Dictionary<string, BlockingCollection<Command>> waitlist = new Dictionary<string, BlockingCollection<Command>>(); + private object syncObject = new object(); + + public void add(Command cm) { + lock (syncObject) { + if (waitlist.ContainsKey(cm.key)) { + waitlist[cm.key].TryAdd(cm); + } else { + BlockingCollection<Command> queue = new BlockingCollection<Command>(); + queue.TryAdd(cm); + waitlist.Add(cm.key, queue); + } + } + } + + + public bool ContainsKey(string key) { + lock (syncObject) { + return waitlist.ContainsKey(key); + } + } +} +} \ No newline at end of file