DBTaskQueue.cs 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  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 async void Start(DBTaskQueue self)
  18. {
  19. while (true)
  20. {
  21. if (self.IsDisposed)
  22. {
  23. return;
  24. }
  25. DBTask task = await self.Get();
  26. try
  27. {
  28. await task.Run();
  29. }
  30. catch (Exception e)
  31. {
  32. Log.Error(e);
  33. }
  34. task.Dispose();
  35. }
  36. }
  37. }
  38. public sealed class DBTaskQueue : Component
  39. {
  40. public Queue<DBTask> queue = new Queue<DBTask>();
  41. public TaskCompletionSource<DBTask> tcs;
  42. public void Add(DBTask task)
  43. {
  44. if (this.tcs != null)
  45. {
  46. var t = this.tcs;
  47. this.tcs = null;
  48. t.SetResult(task);
  49. return;
  50. }
  51. this.queue.Enqueue(task);
  52. }
  53. public Task<DBTask> Get()
  54. {
  55. if (this.queue.Count > 0)
  56. {
  57. DBTask task = this.queue.Dequeue();
  58. return Task.FromResult(task);
  59. }
  60. TaskCompletionSource<DBTask> t = new TaskCompletionSource<DBTask>();
  61. this.tcs = t;
  62. return t.Task;
  63. }
  64. }
  65. }