1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- using System.Collections.Concurrent;
- namespace etoy
- {
- class CmdExportClientCode : Command
- {
- private readonly List<Exception> _errors = new List<Exception>();
- ConcurrentQueue<string> _dones = new ConcurrentQueue<string>();
- 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();
- }
- }
- }
- }
|