DBTaskQueue.cs 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. using System;
  2. using System.Collections.Generic;
  3. namespace ETModel
  4. {
  5. [ObjectSystem]
  6. public class DbTaskQueueAwakeSystem : AwakeSystem<DBTaskQueue>
  7. {
  8. public override void Awake(DBTaskQueue self)
  9. {
  10. self.queue.Clear();
  11. }
  12. }
  13. [ObjectSystem]
  14. public class DbTaskQueueStartSystem : StartSystem<DBTaskQueue>
  15. {
  16. public override void Start(DBTaskQueue self)
  17. {
  18. StartAsync(self).Coroutine();
  19. }
  20. public async ETVoid StartAsync(DBTaskQueue self)
  21. {
  22. long instanceId = self.InstanceId;
  23. while (true)
  24. {
  25. if (self.InstanceId != instanceId)
  26. {
  27. return;
  28. }
  29. DBTask task = await self.Get();
  30. try
  31. {
  32. await task.Run();
  33. }
  34. catch (Exception e)
  35. {
  36. Log.Error(e);
  37. }
  38. task.Dispose();
  39. }
  40. }
  41. }
  42. public sealed class DBTaskQueue : Component
  43. {
  44. public Queue<DBTask> queue = new Queue<DBTask>();
  45. public ETTaskCompletionSource<DBTask> tcs;
  46. public void Add(DBTask task)
  47. {
  48. if (this.tcs != null)
  49. {
  50. var t = this.tcs;
  51. this.tcs = null;
  52. t.SetResult(task);
  53. return;
  54. }
  55. this.queue.Enqueue(task);
  56. }
  57. public ETTask<DBTask> Get()
  58. {
  59. if (this.queue.Count > 0)
  60. {
  61. DBTask task = this.queue.Dequeue();
  62. return ETTask.FromResult(task);
  63. }
  64. ETTaskCompletionSource<DBTask> t = new ETTaskCompletionSource<DBTask>();
  65. this.tcs = t;
  66. return t.Task;
  67. }
  68. }
  69. }