using System.Collections.Concurrent; namespace etoy { class CmdExportClientCode : Command { private readonly List _errors = new List(); ConcurrentQueue _dones = new ConcurrentQueue(); int _totalStage; public override string Description => "生成客户端的CSharp代码"; protected override void OnProcess() { _dones.Clear(); var generaters = new IGenerater[] { new CSharpCommonTableGenerater(), new CSharpCommonTableRepositoryGenerater(), new CSharpKeyValueTableGenerater(), new CSharpGuideTargetKeyGenerater(), new CSharpMetadataTableGenerater(), new CSharpVersionConfigGenerater(), new CSharpTableLoaderGenerater(), new TxtVersionConfigGenerater(), }; _totalStage = generaters.Length; foreach (IGenerater generater in generaters) Task.Factory.StartNew(OnThreadGen, generater); Task.Factory.StartNew(OnLoop); Task.Factory.StartNew(OnThreadLoop); } private void OnThreadLoop() { while (_dones.Count < _totalStage) Thread.Sleep(10); Completed(); } private void OnThreadGen(object state) { try { var generater = state as IGenerater; generater.Generate(Context); _dones.Enqueue(generater.GetType().Name); SetProgress(_dones.Count / (float)_totalStage); } catch (Exception e) { --_totalStage; _errors.Add(e); } } private void OnLoop() { while (_dones.Count < _totalStage) { Thread.Sleep(1); } if (_errors.Count > 0) { SetException(new Exception(string.Join('\n', (from e in _errors select $"## ERROR: {e}").ToArray()))); } else { Completed(); } } } }