CmdExportClientCode.cs 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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 CSharpVersionConfigGenerater(),
  20. new CSharpTableLoaderGenerater(),
  21. new TxtVersionConfigGenerater(),
  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. }