From 5454bd2e48dfe88de6441728cf98b2429b4dd9d3 Mon Sep 17 00:00:00 2001 From: hondacrx Date: Wed, 28 Jun 2017 18:46:22 -0400 Subject: [PATCH] Fixed being able to creature duplicate characters Closes #2 --- Framework/Database/QueryCallback.cs | 51 ++++++++++++++++------------- 1 file changed, 28 insertions(+), 23 deletions(-) diff --git a/Framework/Database/QueryCallback.cs b/Framework/Database/QueryCallback.cs index 2b760d3f5..79dc0e4cf 100644 --- a/Framework/Database/QueryCallback.cs +++ b/Framework/Database/QueryCallback.cs @@ -42,7 +42,7 @@ namespace Framework.Database public QueryCallback WithChainingCallback(Action callback) { - _callbacks.Add(new QueryCallbackData(callback)); + _callbacks.Enqueue(new QueryCallbackData(callback)); return this; } @@ -53,36 +53,41 @@ namespace Framework.Database public QueryCallbackStatus InvokeIfReady() { - QueryCallbackData callback = _callbacks.First(); - if (_result.IsCompleted) + QueryCallbackData callback = _callbacks.Dequeue(); + + bool hasNext = true; + while (hasNext) { - Task f = _result; - Action cb = callback._result; - _result = null; - callback.Clear(); - - cb(this, f.Result); - - _callbacks.RemoveAt(0); - bool hasNext = _result != null; - if (_callbacks.Empty()) + if (_result != null && _result.Wait(0)) { - Contract.Assert(!hasNext); - return QueryCallbackStatus.Completed; + Task f = _result; + Action cb = callback._result; + _result = null; + + cb(this, f.Result); + + hasNext = _result != null; + if (_callbacks.Count == 0) + { + Contract.Assert(!hasNext); + return QueryCallbackStatus.Completed; + } + + // abort chain + if (!hasNext) + return QueryCallbackStatus.Completed; + + callback = _callbacks.Dequeue(); } - - // abort chain - if (!hasNext) - return QueryCallbackStatus.Completed; - - return QueryCallbackStatus.NextStep; + else + return QueryCallbackStatus.NotReady; } - return QueryCallbackStatus.NotReady; + return QueryCallbackStatus.Completed; } Task _result; - List _callbacks = new List(); + Queue _callbacks = new Queue(); } struct QueryCallbackData