public void Initial(Action <string> progress, Action <long> complete)
        {
            FProgress = progress;
            FComplete = complete;
            IsReady   = false;
            DataPipe pipe1 = null;
            DataPipe pipe2 = null;

            managers.Clear();
            workers.Clear();

            // 1. Create Managers
            var SocketTask  = new SocketClient(Progress);
            var CollectTask = new CollectClient(Progress);
            var TradeTask   = new TradeClient(Progress);

            var GenerateTask = new GenerateClient(Progress);

            GenerateTask.AddGetPlugAction(SocketClient.ID, SocketTask.AddGetPlug);
            GenerateTask.AddPutPlugAction(SocketClient.ID, SocketTask.AddPutPlug);
            GenerateTask.AddGetPlugAction(CollectClient.ID, CollectTask.AddGetPlug);
            GenerateTask.AddPutPlugAction(CollectClient.ID, CollectTask.AddPutPlug);
            GenerateTask.AddGetPlugAction(TradeClient.ID, TradeTask.AddGetPlug);
            GenerateTask.AddPutPlugAction(TradeClient.ID, TradeTask.AddPutPlug);

            pipe1 = new DataPipe();
            pipe2 = new DataPipe();
            SocketTask.AddPutPlug(CollectClient.ID, pipe1);
            CollectTask.AddGetPlug(SocketClient.ID, pipe1);
            SocketTask.AddGetPlug(CollectClient.ID, pipe2);
            CollectTask.AddPutPlug(SocketClient.ID, pipe2);

            pipe1 = new DataPipe();
            pipe2 = new DataPipe();
            SocketTask.AddPutPlug(TradeClient.ID, pipe1);
            TradeTask.AddGetPlug(SocketClient.ID, pipe1);
            SocketTask.AddGetPlug(TradeClient.ID, pipe2);
            TradeTask.AddPutPlug(SocketClient.ID, pipe2);


            managers.Add(new Worker(GenerateClient.ID, GenerateTask));
            managers.Add(new Worker(SocketClient.ID, SocketTask));
            managers.Add(new Worker(CollectClient.ID, CollectTask));
            managers.Add(new Worker(TradeClient.ID, TradeTask));

            //// 2. Create Workers
            //if (stocks != null && stocks.Count > 0)
            //{
            //    foreach (string id in stocks)
            //    {
            //        if(string.IsNullOrWhiteSpace(id) || workers.Any(w=>w.id.Equals(id.Trim().ToUpper())))continue;
            //        var StockTask = new StockClient(id.Trim().ToUpper(), Progress);

            //        pipe1 = new DataPipe();
            //        pipe2 = new DataPipe();
            //        SocketTask.AddPutPlug(StockTask.id, pipe1);
            //        StockTask.AddGetPlug(SocketClient.ID, pipe1);
            //        SocketTask.AddGetPlug(StockTask.id, pipe2);
            //        StockTask.AddPutPlug(SocketClient.ID, pipe2);

            //        pipe1 = new DataPipe();
            //        pipe2 = new DataPipe();
            //        StockTask.AddPutPlug(TradeClient.ID, pipe1);
            //        TradeTask.AddGetPlug(StockTask.id, pipe1);
            //        StockTask.AddGetPlug(TradeClient.ID, pipe2);
            //        TradeTask.AddPutPlug(StockTask.id, pipe2);

            //        pipe1 = new DataPipe();
            //        pipe2 = new DataPipe();
            //        DatabaseTask.AddPutPlug(StockTask.id, pipe1);
            //        StockTask.AddGetPlug(DatabaseClient.ID, pipe1);
            //        DatabaseTask.AddGetPlug(StockTask.id, pipe2);
            //        StockTask.AddPutPlug(DatabaseClient.ID, pipe2);

            //        workers.Add(new Worker(StockTask.id, StockTask, 1000));
            //    }
            //}
            IsReady = true;
        }