DBTaskQueue.cs 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. using System;
  2. using System.Threading.Tasks;
  3. namespace Model
  4. {
  5. [ObjectEvent]
  6. public class DBTaskQueueEvent : ObjectEvent<DBTaskQueue>, IAwake, IStart
  7. {
  8. public void Awake()
  9. {
  10. DBTaskQueue self = this.Get();
  11. self.queue.Clear();
  12. }
  13. public async void Start()
  14. {
  15. DBTaskQueue self = this.Get();
  16. while (true)
  17. {
  18. if (self.Id == 0)
  19. {
  20. return;
  21. }
  22. DBTask task = await self.Get();
  23. try
  24. {
  25. await task.Run();
  26. task.Dispose();
  27. }
  28. catch (Exception e)
  29. {
  30. Log.Error(e.ToString());
  31. }
  32. }
  33. }
  34. }
  35. public sealed class DBTaskQueue : Disposer
  36. {
  37. public EQueue<DBTask> queue = new EQueue<DBTask>();
  38. public TaskCompletionSource<DBTask> tcs;
  39. public void Add(DBTask task)
  40. {
  41. if (this.tcs != null)
  42. {
  43. var t = this.tcs;
  44. this.tcs = null;
  45. t.SetResult(task);
  46. return;
  47. }
  48. this.queue.Enqueue(task);
  49. }
  50. public Task<DBTask> Get()
  51. {
  52. if (this.queue.Count > 0)
  53. {
  54. DBTask task = this.queue.Dequeue();
  55. return Task.FromResult(task);
  56. }
  57. TaskCompletionSource<DBTask> t = new TaskCompletionSource<DBTask>();
  58. this.tcs = t;
  59. return t.Task;
  60. }
  61. }
  62. }