123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- using System.Collections.Concurrent;
- namespace etoy
- {
- /// <summary>
- /// 服务器代码生成命令
- /// TypeScript + Json
- /// </summary>
- class CmdExportServerCode : Command
- {
- private readonly List<Exception> _errors = new List<Exception>();
- ConcurrentQueue<string> _dones = new ConcurrentQueue<string>();
- int _totalStage;
- public override string Description => "生成服务端的代码";
- protected override void OnProcess()
- {
- _dones.Clear();
- var generaters = new IGenerater[]
- {
- new TSXlsConfigGenerater(),
- new TSGameCfgGenerater(),
- new TSKeyValueTableGenerater(),
- };
- _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();
- }
- }
- }
- }
|