using System; using System.Threading.Tasks; namespace Model { [ObjectEvent] public class DBTaskQueueEvent : ObjectEvent, IAwake, IStart { public void Awake() { DBTaskQueue self = this.Get(); self.queue.Clear(); } public async void Start() { DBTaskQueue self = this.Get(); while (true) { if (self.Id == 0) { return; } DBTask task = await self.Get(); try { await task.Run(); task.Dispose(); } catch (Exception e) { Log.Error(e.ToString()); } } } } public sealed class DBTaskQueue : Disposer { public EQueue queue = new EQueue(); public TaskCompletionSource tcs; public void Add(DBTask task) { if (this.tcs != null) { var t = this.tcs; this.tcs = null; t.SetResult(task); return; } this.queue.Enqueue(task); } public Task Get() { if (this.queue.Count > 0) { DBTask task = this.queue.Dequeue(); return Task.FromResult(task); } TaskCompletionSource t = new TaskCompletionSource(); this.tcs = t; return t.Task; } } }