DBTaskQueue.cs 1.4 KB

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