CmdExportClientCode.cs 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  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 CSharpGuideTargetKeyGenerater(),
  19. new CSharpMetadataTableGenerater(),
  20. new CSharpVersionConfigGenerater(),
  21. new CSharpTableLoaderGenerater(),
  22. new TxtVersionConfigGenerater(),
  23. };
  24. _totalStage = generaters.Length;
  25. foreach (IGenerater generater in generaters)
  26. Task.Factory.StartNew(OnThreadGen, generater);
  27. Task.Factory.StartNew(OnLoop);
  28. Task.Factory.StartNew(OnThreadLoop);
  29. }
  30. private void OnThreadLoop()
  31. {
  32. while (_dones.Count < _totalStage)
  33. Thread.Sleep(10);
  34. Completed();
  35. }
  36. private void OnThreadGen(object state)
  37. {
  38. try
  39. {
  40. var generater = state as IGenerater;
  41. generater.Generate(Context);
  42. _dones.Enqueue(generater.GetType().Name);
  43. SetProgress(_dones.Count / (float)_totalStage);
  44. }
  45. catch (Exception e)
  46. {
  47. --_totalStage;
  48. _errors.Add(e);
  49. }
  50. }
  51. private void OnLoop()
  52. {
  53. while (_dones.Count < _totalStage)
  54. {
  55. Thread.Sleep(1);
  56. }
  57. if (_errors.Count > 0)
  58. {
  59. SetException(new Exception(string.Join('\n', (from e in _errors select $"## ERROR: {e}").ToArray())));
  60. }
  61. else
  62. {
  63. Completed();
  64. }
  65. }
  66. }
  67. }