CmdExportServerCode.cs 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. using System.Collections.Concurrent;
  2. namespace etoy
  3. {
  4. /// <summary>
  5. /// 服务器代码生成命令
  6. /// TypeScript + Json
  7. /// </summary>
  8. class CmdExportServerCode : Command
  9. {
  10. private readonly List<Exception> _errors = new List<Exception>();
  11. ConcurrentQueue<string> _dones = new ConcurrentQueue<string>();
  12. int _totalStage;
  13. public override string Description => "生成服务端的代码";
  14. protected override void OnProcess()
  15. {
  16. _dones.Clear();
  17. var generaters = new IGenerater[]
  18. {
  19. new TSXlsConfigGenerater(),
  20. new TSGameCfgGenerater(),
  21. new TSKeyValueTableGenerater(),
  22. };
  23. _totalStage = generaters.Length;
  24. foreach (IGenerater generater in generaters)
  25. Task.Factory.StartNew(OnThreadGen, generater);
  26. Task.Factory.StartNew(OnLoop);
  27. Task.Factory.StartNew(OnThreadLoop);
  28. }
  29. private void OnThreadLoop()
  30. {
  31. while (_dones.Count < _totalStage)
  32. Thread.Sleep(10);
  33. Completed();
  34. }
  35. private void OnThreadGen(object state)
  36. {
  37. try
  38. {
  39. var generater = state as IGenerater;
  40. generater.Generate(Context);
  41. _dones.Enqueue(generater.GetType().Name);
  42. SetProgress(_dones.Count / (float)_totalStage);
  43. }
  44. catch (Exception e)
  45. {
  46. --_totalStage;
  47. _errors.Add(e);
  48. }
  49. }
  50. private void OnLoop()
  51. {
  52. while (_dones.Count < _totalStage)
  53. {
  54. Thread.Sleep(1);
  55. }
  56. if (_errors.Count > 0)
  57. {
  58. SetException(new Exception(string.Join('\n', (from e in _errors select $"## ERROR: {e}").ToArray())));
  59. }
  60. else
  61. {
  62. Completed();
  63. }
  64. }
  65. }
  66. }