CmdExportClientCode.cs 2.2 KB

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